Sdílet prostřednictvím


Úrovně izolace transakcí (ODBC)

Úrovně izolace transakcí představují míru úspěšnosti izolace transakcí. Konkrétně úrovně izolace transakcí jsou definovány přítomností nebo absencí následujících jevů:

  • Špinavá čtení K špinavému čtení dochází, když transakce čte data, která ještě nebyla potvrzena. Předpokládejme například, že transakce 1 aktualizuje řádek. Transakce 2 přečte aktualizovaný řádek před transakcí 1 potvrdí aktualizaci. Pokud transakce 1 vrátí zpět změnu, transakce 2 bude číst data, která jsou považována za neexistující.

  • Neopakovatelné čteníNeopakovatelné čtení nastane, když transakce čte stejný řádek dvakrát, ale pokaždé získá jiná data. Předpokládejme například, že transakce 1 přečte řádek. Transakce 2 aktualizuje nebo odstraní tento řádek a potvrdí aktualizaci nebo odstranění. Pokud transakce 1 znovu načte řádek, načte různé hodnoty řádků nebo zjistí, že byl řádek odstraněn.

  • PřízrakyPřízrak je řádek, který odpovídá kritériím hledání, ale na začátku se nezobrazuje. Předpokládejme například, že transakce 1 čte sadu řádků, které splňují určitá kritéria hledání. Transakce 2 vygeneruje nový řádek (prostřednictvím aktualizace nebo vložení), který odpovídá kritériím hledání pro transakci 1. Pokud transakce 1 znovu vykoná příkaz, který čte řádky, získá jinou sadu řádků.

Čtyři úrovně izolace transakcí (jak je definováno SQL-92) jsou definovány z hlediska těchto jevů. V následující tabulce označuje "X" každý jev, který může nastat.

Úroveň izolace transakcí Zašpiněná čtení Neopakovatelné čtení Přízraky
Nepotvrzené čtení X X X
Čtení potvrzeno -- X X
Opakovatelné čtení -- -- X
Serializovatelný -- -- --

Následující tabulka popisuje jednoduché způsoby, jak může DBMS implementovat úrovně izolace transakcí.

Důležité

Většina systémů správy databází používá ke zvýšení souběžnosti složitější schémata než tato. Tyto příklady jsou k dispozici pouze pro ilustraci. Konkrétně rozhraní ODBC nepředepisuje, jak konkrétní DBMS izolují transakce od sebe navzájem.

Izolace transakcí Možná implementace
Nepotvrzené čtení Transakce nejsou navzájem izolované. Pokud DBMS podporuje jiné úrovně izolace transakcí, ignoruje jakýkoli mechanismus, který používá k implementaci těchto úrovní. Aby neovlivňovaly jiné transakce, transakce spuštěné na úrovni čtení nepotvrzené jsou obvykle pouze pro čtení.
Čtení potvrzeno Transakce čeká na odemknutí řádků uzamčených jinými transakcemi; tím zabráníte čtení všech "nečistých" dat.

Transakce obsahuje zámek pro čtení (pokud čte pouze řádek) nebo zámek zápisu (pokud aktualizuje nebo odstraní řádek) na aktuálním řádku, aby se zabránilo aktualizaci nebo odstranění jiných transakcí. Transakce uvolní zámky čtení, když se přesune mimo aktuální řádek. Uchovává zámky pro zápis, dokud není potvrzeno nebo vráceno zpět.
Opakovatelné čtení Transakce čeká na odemknutí řádků uzamčených jinými transakcemi; tím zabráníte čtení všech "nečistých" dat.

Transakce uchovává zámky čtení na všech řádcích, které se vrátí do aplikace, a zapisuje zámky na všech řádcích, které vloží, aktualizuje nebo odstraní. Například pokud transakce obsahuje příkaz SQL SELECT * FROM Orders, transakce uzamkne ke čtení řádky v době, jak je aplikace načítá. Pokud transakce obsahuje příkaz SQL DELETE FROM Orders WHERE Status = 'CLOSED', transakce zamkne řádky při jejich odstranění.

Vzhledem k tomu, že jiné transakce nemohou aktualizovat nebo odstranit tyto řádky, aktuální transakce se vyhne neopakovatelným čtením. Transakce uvolní své zámky při jejím potvrzení nebo při jejím vrácení zpět.
Serializovatelný Transakce čeká na odemknutí řádků uzamčených jinými transakcemi; tím zabráníte čtení všech "nečistých" dat.

Transakce uchovává zámek pro čtení (pokud čte pouze řádky) nebo zámek zápisu (pokud může aktualizovat nebo odstranit řádky) v oblasti řádků, které ovlivňuje. Například pokud transakce obsahuje příkaz SQL SELECT * FROM Orders, rozsah je celá tabulka Orders; transakce zamkne tabulku a neumožňuje, aby do ní byly vloženy žádné nové řádky. Pokud transakce obsahuje příkaz SQL DELETE FROM Orders WHERE Status = 'CLOSED', rozsah je všechny řádky se stavem "UZAVŘENO"; transakce zamkne všechny řádky v tabulce Objednávky se stavem "UZAVŘENO" a neumožňuje vložení nebo aktualizaci žádných řádků tak, aby výsledný řádek má stav "UZAVŘENO".

Vzhledem k tomu, že jiné transakce nemohou aktualizovat nebo odstranit řádky v daném rozsahu, aktuální transakce zamezuje jakýmkoli neopakovatelným čtením. Protože jiné transakce nemohou vložit žádné řádky v oblasti, aktuální transakce zabraňuje jakýmkoli fantomům. Transakce uvolní svůj zámek, když je potvrzena nebo vrácena zpět.

Je důležité si uvědomit, že úroveň izolace transakce nemá vliv na schopnost transakce vidět své vlastní změny; transakce mohou vždy zobrazit všechny změny, které dělají. Například transakce se může skládat ze dvou příkazů UPDATE, z nichž první zvýší plat všech zaměstnanců o 10 procent a druhý nastaví mzdu tak, aby mzda zaměstnanců překračující určitou maximální částku byla nastavena na tuto maximální částku. To je úspěšné jako jedna transakce pouze proto, že druhý příkaz UPDATE může zobrazit výsledky první.