602SQL-Úplná dokumentace Index  

Izolace transakcí (SQL)

Klient databázového serveru může nastavit stupeň izolace vlastních transakcí od transakcí prováděných jinými klienty. Izolace transakcí určuje, v jaké míře se mohou změny v databázi souběžně prováděné různými klienty navzájem ovlivňovat.

Stupně izolace transakcí jsou definovány svojí schopností bránit vzniku tří fenoménů, k nimž by při souběžné práci klientů A a B mohlo docházet:

Fenomén DIRTY READ: Klient A provede změnu dat a prozatím neukončí transakci. Klient B přečte tato změněná data. Poté klient A odvolá svou transakci. Klient B tedy přečetl data, která nikdy nebyla potvrzena.

Fenomén NON-REPEATABLE READ: Klient A přečte data a prozatím neukončí transakci. Klient B změní nebo zruší tato data a ukončí svou transakci. Klient A ve své transakci znovu čte stejná data a nenajde je.

Fenomén PHANTOM: Klient A položí dotaz, přečte odpověď na něj a prozatím neukončí transakci. Klient B vloží do databáze další řádky vyhovující podmínkám v dotazu klienta A a ukončí svou transakci. Klient A ve své transakci znovu položí stejný dotaz a obdrží jinou odpověď.

Jednotlivé stupně izolace transakcí jsou definovány takto:

Stupeň izolace / fenomén DIRTY READ NON-REPEATABLE READ PHANTOM
READ UNCOMMITTED může nastat může nastat může nastat
READ COMMITTED nemůže nastat může nastat může nastat
REPEATABLE READ nemůže nastat nemůže nastat může nastat
SERIALIZABLE nemůže nastat nemůže nastat nemůže nastat

Stupeň izolace SERIALIZABLE zaručuje, že souběžné transakce budou mít stejný efekt, jako by byly provedeny po sobě. Zároveň však snižuje schopnost serveru provádět akce souběžně, tudíž může snížit propustnost serveru, pokud více klientů pracuje se stejnými daty. Zároveň se velmi zvýší počty dočasných zámků na přečtených datech.

Pro explicitní transakce platí:

Pro implicitní transakce platí:

Interně SQL server 602SQL implementuje pouze stupně izolace READ COMMITTED a SERIALIZABLE. Při nastavení READ UNCOMMITTED se vnitřně nastaví READ COMMITTED, při nastavení REPEATABLE READ se vnitřně nastaví SERIALIZABLE. Toto chování je plně v souladu s normou.