Sobes.tech
Middle+

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ő:

  1. 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.

  2. 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.

  3. 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.

  4. 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.