Milyen anomáliák fordulhatnak elő párhuzamos tranzakciók végrehajtása során?
sobes.tech MI
Válasz az MI-től
Amikor párhuzamosan hajtanak végre tranzakciókat, a következő anomáliák fordulhatnak elő:
-
Elveszett frissítés (Lost Update): Egy tranzakció felülírja egy másik tranzakció módosításait, mielőtt azok rögzítésre kerülnének.
Idő 1. tranzakció 2. tranzakció t1 Olvassa a egyenleget (pl. 100) t2 Olvassa a egyenleget (pl. 100) t3 Növeli az egyenleget 10-zel (Egyenleg = 110) t4 Növeli az egyenleget 20-szal (Egyenleg = 120) t5 Rögzíti a változtatásokat (Egyenleg 110 lesz) t6 Rögzíti a változtatásokat (Egyenleg 120 lesz) Eredmény: A két növelés ellenére a végső Egyenleg értéke 120, nem 130. Az 1. tranzakció növelése elveszett.
-
Piszkos olvasás (Dirty Read): Egy tranzakció olvassa a nem rögzített változtatásokat egy másik tranzakciótól. Ha az utóbbi tranzakció visszavonásra kerül, az olvasott adatok érvénytelenek lesznek.
Idő 1. tranzakció 2. tranzakció t1 Kezdi a egyenleg módosítását (100 -> 110) t2 Olvassa az egyenleget (110) t3 Visszavonja a módosítást (Egyenleg vissza 100) t4 Azt használja, mint 110-et a számításokban, pedig az eredeti érték 100 Eredmény: A 2. tranzakció olyan adatokra alapoz, amelyek végül nem kerültek rögzítésre.
-
Nem ismételhető olvasás (Non-Repeatable Read): Egy tranzakción belül ugyanazt a sort többször olvasva különböző értékeket kapunk, mert egy másik tranzakció módosította ezt a sort a két olvasás között.
Idő 1. tranzakció 2. tranzakció t1 Olvassa a egyenleget (100-at kap) t2 Módosítja az egyenleget 110-re és rögzíti t3 Újra olvassa az egyenleget (110-et kap, nem 100-at) Eredmény: Az egyenleg megváltozott ugyanazon tranzakción belül, ami helytelen eredményekhez vezethet.
-
Fantom olvasás (Phantom Read): Hasonló a nem ismételhető olvasáshoz, de nem a meglévő sorok módosításáról, hanem új sorok hozzáadásáról vagy törléséről szól, amelyek befolyásolják a lekérdezés eredményét.
Idő 1. tranzakció 2. tranzakció t1 Lefuttatja a SELECT COUNT(*) FROM Orders WHERE Status = 'Pending'lekérdezést (5-öt kap)t2 Új 'Pending' státuszú rendelést ad hozzá és rögzíti t3 Újra lefuttatja a SELECT COUNT(*) FROM Orders WHERE Status = 'Pending'(6-ot kap)Eredmény: A lekérdezés ismételt futtatásakor "fantom" sorok jelennek meg, amelyek az első olvasáskor nem voltak.
Ezek az anomáliák elkerülhetők különböző tranzakciós izolációs szintek alkalmazásával.