Máte pravdu:na standardní úrovni izolace
, read committed
, nemusíte vybrané výpisy zabalovat do transakcí. Vybrané výpisy budou chráněny před nečistými čteními, ať už je zabalíte do transakce nebo ne.
connection 1: connection 2:
begin transaction
update user set name = 'Bill' where id = 1
select name from users where id = 1
rollback transaction
Příkaz select nebude číst vrácenou aktualizaci:nezáleží na tom, že nejsou zabaleny do transakce.
Pokud potřebujete opakovatelné čtení , pak nepomůže zabalení výběrů do výchozí transakce:
connection 1: connection 2:
begin transaction
select name from users where id = 1
update user set name = 'Bill' where id = 1
select name from users where id = 1
commit transaction
begin
a commit
zde nepomohou příkazy:druhý select
může přečíst starý název, nebo může přečtěte si nový název.
Pokud však používáte vyšší úroveň izolace, například serializable
nebo repeatable read
, bude skupina chráněna před neopakovatelným čtením:
connection 1: connection 2:
set transaction isolation level
repeatable read
begin transaction
select name from users where id = 1
update user set name = 'Bill' where id = 1
select name from users where id = 1 |
commit transaction |
|--> executed here
V tomto scénáři update
se zablokuje, dokud nebude dokončena první transakce.
Vyšší úrovně izolace se používají zřídka, protože snižují počet lidí, kteří mohou současně pracovat v databázi. Na nejvyšší úrovni, serializable
, dotaz na vytváření přehledů zastaví jakoukoli aktualizační aktivitu.