Sobes.tech
Middle+

Aké anomálie môžu nastať pri vykonávaní paralelných transakcií?

sobes.tech AI

Odpoveď od AI

Pri paralelnom vykonávaní transakcií môžu nastať nasledujúce anomálie:

  1. Stratené aktualizácie (Lost Update): Jedna transakcia prepíše zmeny inej transakcie skôr, než boli tieto zmeny potvrdené.

    Čas Transakcia 1 Transakcia 2
    t1 Číta hodnotu zostatku (napríklad 100)
    t2 Číta hodnotu zostatku (napríklad 100)
    t3 Zvyšuje zostatok o 10 (Zostatok = 110)
    t4 Zvyšuje zostatok o 20 (Zostatok = 120)
    t5 Potvrdzuje zmeny (Zostatok sa stáva 110)
    t6 Potvrdzuje zmeny (Zostatok sa stáva 120)

    Výsledok: Napriek dvom zvýšeniam je konečná hodnota zostatku 120, nie 130. Zvýšenie od transakcie 1 je stratené.

  2. Špinavé čítanie (Dirty Read): Jedna transakcia číta nepotvrdené zmeny inej transakcie. Ak sa zmeny, ktoré urobila, vrátia späť, prečítané údaje budú neplatné.

    Čas Transakcia 1 Transakcia 2
    t1 Začína meniť zostatok (100 -> 110)
    t2 Číta zostatok (získa 110)
    t3 Vracia zmeny späť (Zostatok sa vráti na 100)
    t4 Používa zostatok = 110 v výpočtoch, hoci skutočná hodnota je 100

    Výsledok: Transakcia 2 zakladá svoje akcie na údajoch, ktoré nakoniec neboli potvrdené.

  3. Neopakovateľné čítanie (Non-Repeatable Read): Počas jednej transakcie dostanú opakované čítania tej istej riadky rôzne hodnoty, pretože iná transakcia potvrdila zmeny tejto riadky medzi čítaniami.

    Čas Transakcia 1 Transakcia 2
    t1 Číta zostatok (získa 100)
    t2 Mení zostatok na 110 a potvrdzuje
    t3 Opäť číta zostatok (získa 110 namiesto očakávaných 100)

    Výsledok: Zostatok sa zmenil v rámci jednej transakcie, čo môže viesť k nesprávnym výsledkom.

  4. Fantomové čítanie (Phantom Read): Podobné neopakovateľnému čítaniu, ale týka sa nie zmien existujúcich riadkov, ale pridania alebo odstránenia riadkov, ktoré ovplyvňujú výsledky dotazu s predikátom.

    Čas Transakcia 1 Transakcia 2
    t1 Vykonáva dotaz SELECT COUNT(*) FROM Orders WHERE Status = 'Pending' (získa 5)
    t2 Pridáva novú objednávku so stavom 'Pending' a potvrdzuje
    t3 Opäť vykonáva SELECT COUNT(*) FROM Orders WHERE Status = 'Pending' (získa 6)

    Výsledok: Pri opakovanom vykonaní dotazu sa objavia "fantómové" riadky, ktorých pri prvom čítaní nebolo.

Tieto anomálie sa zabraňujú použitím rôznych úrovní izolácie transakcií.