|
Transakce a body návratu | Problémy při kombinaci explicitního zamykání záznamů a izolace transakcí |
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í:
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.
Transakce a body návratu | Problémy při kombinaci explicitního zamykání záznamů a izolace transakcí |