2.1 Kötelezettség nélküli olvasás
A "tranzakció elkülönítési szint" a DBMS belső mechanizmusai által biztosított (azaz nem igényel speciális programozást) védelmi fokát a tranzakciók párhuzamos végrehajtása során fellépő összes vagy néhány fenti típusú adatinkonzisztencia ellen. Az SQL-92 szabvány négy elkülönítési szintből álló skálát határoz meg:
- Elkötelezettség nélkül olvasni
- Olvasni elkötelezett
- Ismételhető olvasmány
- Sorozatozható
Közülük az első a leggyengébb, az utolsó a legerősebb, minden következő tartalmazza az összes előzőt.
A legalacsonyabb (első) izolációs szint. Ha több párhuzamos tranzakció próbálja meg módosítani ugyanazt a táblasort, akkor az utolsó sor értéket a sikeresen befejezett tranzakciók teljes halmaza határozza meg. Ebben az esetben nem csak logikailag inkonzisztens adatok olvashatók, hanem olyan adatok is, amelyek változásait még nem rögzítették.
Ennek az elkülönítési szintnek a megvalósításának tipikus módja az adatok zárolása a változtatási parancs végrehajtása közben, ami biztosítja, hogy az ugyanazon sorokon lévő, párhuzamosan futó módosítási parancsok ténylegesen szekvenciálisan végrehajtásra kerüljenek, és a módosítások ne vesszenek el. A csak olvasható tranzakciókat soha nem blokkolják ezen az elkülönítési szint alatt.
2.2 Elkötelezett
A legtöbb ipari DBMS, különösen a Microsoft SQL Server, a PostgreSQL és az Oracle alapértelmezés szerint ezt a szintet használja. Ezen a szinten biztosított a huzat, „piszkos” leolvasás elleni védelem, azonban az egyik tranzakció lebonyolítása során egy másik sikeresen lebonyolítható és az általa végrehajtott változtatások rögzítésre kerülnek. Ennek eredményeként az első tranzakció más adatkészlettel fog működni.
A teljes olvasás megvalósítása két megközelítés egyikén alapulhat: blokkolás vagy verziószámítás.
Az olvasható és módosítható adatok blokkolása.
Abból áll, hogy az írási tranzakció lezárásig blokkolja az olvasási készenléti vagy magasabb szinten működő tranzakciók olvasásához szükséges mutálható adatokat, így megakadályozza a "piszkos" olvasást, és az olvasási tranzakció által zárolt adatok a művelet befejezése után azonnal felszabadulnak. SELECT
(így adott izolációs szinten előfordulhat "nem megismételhető olvasás" helyzet).
A párhuzamosan változó sorok több verziójának mentése.
Valahányszor módosítanak egy sort, a DBMS létrehozza ennek a sornak egy új verzióját, amellyel az adatokat megváltoztató tranzakció tovább működik, míg minden más „olvasási” tranzakció az utolsó véglegesített verziót adja vissza. Ennek a megközelítésnek az az előnye, hogy gyorsabb, mert megakadályozza a blokkolást. Az elsőhöz képest azonban lényegesen nagyobb RAM-felhasználást igényel, amelyet a soros verziók tárolására fordítanak.
Ezen túlmenően, ha több tranzakció párhuzamosan módosítja az adatokat, az olyan helyzetet teremthet, hogy több egyidejű tranzakció inkonzisztens változtatásokat hajt végre ugyanazon az adatokon (mivel nincs zárolás, ennek semmi sem akadályozza meg). Ekkor az elsőként véglegesítő tranzakció elmenti a változtatásait a fő adatbázisban, és a fennmaradó párhuzamos tranzakciók véglegesítése lehetetlenné válik (mivel ez az első tranzakció frissítésének elvesztéséhez vezet). Az egyetlen dolog, amit a DBMS ilyen helyzetben tehet, az az, hogy visszaállítja a többi tranzakciót, és „A rekord már megváltozott” hibaüzenetet ad ki.
Egy konkrét megvalósítási módot a DBMS fejlesztők választanak ki, és bizonyos esetekben testreszabható. Az MS SQL tehát alapértelmezés szerint zárakat használ, de (2005-ös és újabb verziókban) az READ_COMMITTED_SNAPSHOT
adatbázisparaméter beállításakor átvált a verziókezelési stratégiára, az Oracle kezdetben csak a verziózott séma szerint működik. Az Informixben megakadályozhatja az olvasási és írási tranzakciók közötti ütközéseket egy olyan konfigurációs beállítás megadásával USELASTCOMMITTED
(a 11.1-es verziótól), amely az olvasási tranzakcióhoz a legfrissebb véglegesített adatokat kapja.
2.3 Ismételhető leolvasás
Az a szint, amelyen az olvasási tranzakció „nem látja”, megváltozik a korábban olvasott adatokhoz képest. Ugyanakkor egyetlen másik tranzakció sem módosíthatja az aktuális tranzakció által beolvasott adatokat annak befejezéséig.
A megosztott módban lévő zárolások a tranzakció bármely utasítása által olvasott összes adatra vonatkoznak, és a tranzakció befejezéséig megmaradnak. Ez megakadályozza, hogy más tranzakciók módosítsák a függőben lévő tranzakció által beolvasott sorokat. Más tranzakciók azonban új sorokat szúrhatnak be, amelyek megfelelnek az aktuális tranzakcióban található utasítások keresési feltételeinek. Amikor az utasítást az aktuális tranzakció újraindítja, új sorok kerülnek lehívásra, ami fantomolvasást eredményez.
Tekintettel arra, hogy a megosztott zárolások a tranzakció végéig megmaradnak, nem pedig az egyes utasítások végén szabadulnak fel, az egyidejűség mértéke alacsonyabb, mint az elkülönítési szint READ COMMITTED
. Ezért általában nem ajánlott ezt és a magasabb tranzakciós szinteket szükségtelenül használni.
2.4 Sorosozható
A legmagasabb szintű elszigeteltség; A tranzakciók teljesen el vannak szigetelve egymástól, mindegyiket úgy hajtják végre, mintha nem lennének párhuzamos tranzakciók. Csak ezen a szinten nem vonatkozik az egyidejű tranzakciókra a „fantomolvasás” effektus.
2.5 A tranzakciók elkülönítésének támogatása valós DBMS-ben
A tranzakciós DBMS nem mindig támogatja mind a négy szintet, és továbbiakat is bevezethet. A szigetelés biztosításának különféle árnyalatai is vannak.
Tehát az Oracle elvileg nem támogatja a nulla szintet, mivel a tranzakciók megvalósítása kizárja a „piszkos olvasást”, formálisan pedig nem teszi lehetővé az Ismételhető olvasási szint beállítását, vagyis csak (alapértelmezés szerint) Read committed
és Serializable
. Ugyanakkor az egyes parancsok szintjén tulajdonképpen garantálja az olvasás megismételhetőségét (ha SELECT
az első tranzakcióban lévő parancs kiválaszt egy sor sort az adatbázisból, és ekkor egy párhuzamos második tranzakció megváltoztat e sorok egy részét, akkor a az első tranzakció által kapott eredménykészlet változatlan sorokat fog tartalmazni, mintha nem lenne második tranzakció). Az Oracle támogatja az úgynevezett READ-ONLY
tranzakciókat is, amelyek megfelelnek a -nak Serializable
, de magukat az adatokat nem tudják megváltoztatni.
A Microsoft SQL Server támogatja mind a négy szabványos tranzakció-elkülönítési szintet, valamint a SNAPSHOT szintet, amelyen a tranzakció látja az indítás előtti adatállapotot, valamint a saját maga által végrehajtott változtatásokat, azaz úgy viselkedik, mint ha megkapta az indításkor, egy pillanatképet a DB adatokról, és működik vele. A különbség a Serializedhez képest az, hogy nem használnak zárakat, de ennek eredményeként előfordulhat, hogy a változtatások végrehajtása nem lehetséges, ha egy párhuzamos tranzakció korábban megváltoztatta ugyanazokat az adatokat; ebben az esetben a második tranzakció, amikor megpróbálja végrehajtani, COMMIT
hibaüzenetet ad, és törlődik.
GO TO FULL VERSION