Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A tranzakcióelkülönítési szintek a tranzakcióelkülönítés sikerességének mértékét mérik. A tranzakcióelkülönítési szinteket különösen a következő jelenségek jelenléte vagy hiánya határozza meg:
Piszkos olvasásokA piszkos olvasás akkor fordul elő, ha egy tranzakció még nem véglegesített adatokat olvas be. Tegyük fel például, hogy az 1. tranzakció frissít egy sort. A 2. tranzakció beolvassa a frissített sort, mielőtt az 1. tranzakció véglegesíti a frissítést. Ha az 1. tranzakció visszaállítja a módosítást, a 2. tranzakció olyan adatokat fog olvasni, amelyek soha nem léteztek.
Nem megismételhető olvasásokNem megismételhető olvasás akkor fordul elő, ha egy tranzakció kétszer olvassa be ugyanazt a sort, de minden alkalommal különböző adatokat kap. Tegyük fel például, hogy az 1. tranzakció beolvassa a sort. A 2. tranzakció frissíti vagy törli a sort, és véglegesíti a frissítést vagy a törlést. Ha az 1. tranzakció újraolvassa a sort, különböző sorértékeket kér le, vagy észleli, hogy a sor törölve lett.
Phantoms A fantom olyan sor, amely megfelel a keresési feltételeknek, de kezdetben nem látható. Tegyük fel például, hogy az 1. tranzakció olyan sorokat olvas be, amelyek megfelelnek bizonyos keresési feltételeknek. A 2. tranzakció létrehoz egy új sort (frissítéssel vagy beszúrással), amely megfelel az 1. tranzakció keresési feltételeinek. Ha az 1. tranzakció újra végrehajtja az utasítást, amely a sorokat olvassa be, másik sorkészletet kap.
A négy tranzakcióelkülönítési szint (az SQL-92 által meghatározottak szerint) e jelenségek szempontjából van meghatározva. A következő táblázatban egy "X" jelöli az egyes jelenségeket, amelyek előfordulhatnak.
| Tranzakcióelkülönítési szint | Piszkos olvasások | Nem megismételhető olvasások | Fantomok |
|---|---|---|---|
| Elkötelezetlen olvasás | X | X | X |
| Elkötelezett olvasás | -- | X | X |
| Ismételhető olvasás | -- | -- | X |
| Szerializálható | -- | -- | -- |
Az alábbi táblázat azokat az egyszerű módszereket ismerteti, amelyekkel a DBMS implementálhatja a tranzakcióelkülönítési szinteket.
Fontos
A dbMS-k többsége ennél összetettebb sémákat használ az egyidejűség növelése érdekében. Ezek a példák csak illusztrációs célokra szolgálnak. Az ODBC nem írja elő, hogy egyes DBMS-k hogyan különítsék el egymástól a tranzakciókat.
| Tranzakciós elkülönítés | Lehetséges megvalósítás |
|---|---|
| Elkötelezetlen olvasás | A tranzakciók nem különíthetők el egymástól. Ha a DBMS más tranzakcióelkülönítési szinteket is támogat, figyelmen kívül hagyja a szintek implementálásához használt mechanizmusokat. Hogy ne befolyásolják hátrányosan a többi tranzakciót, a Read Uncommitted szinten futó tranzakciók általában csak olvashatók. |
| Elkötelezett olvasás | A tranzakció megvárja, amíg a többi tranzakció által zárolt sorok feloldódnak; ez megakadályozza a "piszkos" adatok beolvasását. A tranzakció olvasási zárolást (ha csak a sort olvassa) vagy írási zárolást (ha frissíti vagy törli a sort) az aktuális sorban, hogy más tranzakciók ne frissíthesse vagy töröljék. A tranzakció feloldja az olvasási zárolásokat, amikor az elmozdul az aktuális sorból. Írási zárolásokat tart fenn, amíg véglegesítésre nem kerül vagy vissza nem állítják. |
| Ismételhető olvasás | A tranzakció megvárja, amíg a többi tranzakció által zárolt sorok feloldódnak; ez megakadályozza a "piszkos" adatok beolvasását. A tranzakció az alkalmazásnak visszaadott összes sor olvasási zárolásait tárolja, és minden beszúrt, frissített vagy törölt sorra ír zárolásokat. Ha például a tranzakció tartalmazza a SELECT * FROM Orders SQL utasítást, a tranzakció az alkalmazás lekérdezése közben olvasási zárolást alkalmaz a sorokra. Ha a tranzakció tartalmazza a DELETE FROM Orders WHERE Status = 'CLOSED' SQL utasítást, a tranzakció írási zárolást alkalmaz a sorokra, miközben törli őket. Mivel más tranzakciók nem tudják frissíteni vagy törölni ezeket a sorokat, az aktuális tranzakció elkerüli a nem megismételhető olvasásokat. A tranzakció véglegesítésekor vagy visszagördítésekor feloldja a zárolásokat. |
| Szerializálható | A tranzakció megvárja, amíg a többi tranzakció által zárolt sorok feloldódnak; ez megakadályozza a "piszkos" adatok beolvasását. A tranzakció olvasási zárolást (ha csak sorokat olvas be) vagy írási zárolást (ha képes sorok frissítésére vagy törlésére) az érintett sorok tartományán. Ha például a tranzakció tartalmazza a SELECT * FROM Orders SQL utasítást, a tartomány a teljes Rendelések tábla; a tranzakció olvasási zárolást végez a táblán, és nem teszi lehetővé új sorok beszúrását. Ha a tranzakció tartalmazza a DELETE FROM Orders WHERE Status = "CLOSED" SQL utasítást, akkor a tartomány az összes "CLOSED" állapotú sor; a tranzakció írása zárolja az Orders tábla összes sorát "CLOSED" állapottal, és nem teszi lehetővé a sorok beszúrását vagy frissítését, hogy az eredményként kapott sor állapota "CLOSED" legyen. Mivel más tranzakciók nem tudják frissíteni vagy törölni a tartomány sorait, az aktuális tranzakció elkerüli a nem megismételhető olvasásokat. Mivel más tranzakciók nem tudnak sorokat beszúrni a tartományba, az aktuális tranzakció elkerüli a fantomokat. A tranzakció véglegesítésekor vagy visszavonásakor feloldja a zárolását. |
Fontos megjegyezni, hogy a tranzakcióelkülönítési szint nem befolyásolja a tranzakciók saját változásainak megtekintését; a tranzakciók mindig láthatják az általuk végzett módosításokat. Egy tranzakció például két UPDATE utasításból állhat, amelyek közül az első 10 százalékkal emeli az összes alkalmazott fizetését, a második pedig az alkalmazottak fizetését bizonyos maximális összegre állítja. Ez csak egyetlen tranzakcióként sikeres, mert a második UPDATE utasítás láthatja az első eredményét.