Jaké anomálie mohou nastat při provádění paralelních transakcí?
sobes.tech AI
Odpověď od AI
Při paralelním provádění transakcí mohou nastat následující anomálie:
-
Ztracená aktualizace (Lost Update): Jedna transakce přepíše změny jiné transakce dříve, než jsou potvrzeny.
Čas Transakce 1 Transakce 2 t1 Čte hodnotu zůstatku (například 100) t2 Čte hodnotu zůstatku (například 100) t3 Zvyšuje zůstatek o 10 (Zůstatek = 110) t4 Zvyšuje zůstatek o 20 (Zůstatek = 120) t5 Potvrzuje změny (Zůstatek se stává 110) t6 Potvrzuje změny (Zůstatek se stává 120) Výsledek: Navzdory dvěma zvýšením je konečná hodnota Zůstatku 120, nikoli 130. Zvýšení od transakce 1 bylo ztraceno.
-
Špinavé čtení (Dirty Read): Jedna transakce čte neuložené změny jiné transakce. Pokud se změny vrátí zpět, přečtená data jsou neplatná.
Čas Transakce 1 Transakce 2 t1 Začíná měnit zůstatek (100 -> 110) t2 Čte zůstatek (získá 110) t3 Vrací změnu (Zůstatek se vrací na 100) t4 Používá zůstatek = 110 ve výpočtech, ačkoliv skutečná hodnota je 100 Výsledek: Transakce 2 zakládá své akce na datech, která nakonec nebyla potvrzena.
-
Nepotvrditelné čtení (Non-Repeatable Read): Během jedné transakce se při opakovaném čtení stejného řádku získají různé hodnoty, protože jiná transakce provedla změny tohoto řádku mezi čteními.
Čas Transakce 1 Transakce 2 t1 Čte zůstatek (získá 100) t2 Mění zůstatek na 110 a potvrzuje t3 Opět čte zůstatek (získá 110 místo 100) Výsledek: Zůstatek se změnil v rámci jedné transakce, což může vést k nesprávným výsledkům.
-
Fantomové čtení (Phantom Read): Podobné jako nepotvrditelné čtení, ale týká se přidání nebo odstranění řádků, které ovlivňují výsledky dotazu s predikátem.
Čas Transakce 1 Transakce 2 t1 Spouští dotaz SELECT COUNT(*) FROM Orders WHERE Status = 'Pending'(získá 5)t2 Přidává novou objednávku se stavem 'Pending' a potvrzuje t3 Opět spouští SELECT COUNT(*) FROM Orders WHERE Status = 'Pending'(získá 6)Výsledek: Při opakovaném provedení dotazu se objeví "fantomové" řádky, které při prvním čtení nebyly.
Tato anomálie jsou zabráněna použitím různých úrovní izolace transakcí.