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.