Sobes.tech
Middle+

Какви аномалии могат да възникнат при изпълнение на паралелни транзакции?

sobes.tech AI

Отговор от AI

Когато транзакциите се изпълняват паралелно, могат да възникнат следните аномалии:

  1. Загубена актуализация (Lost Update): Една транзакция презаписва промените на друга транзакция, преди те да бъдат потвърдени.

    Време Транзакция 1 Транзакция 2
    t1 Чете стойността на Баланса (например 100)
    t2 Чете стойността на Баланса (например 100)
    t3 Увеличава Баланса с 10 (Баланс = 110)
    t4 Увеличава Баланса с 20 (Баланс = 120)
    t5 Потвърждава промените (Баланс става 110)
    t6 Потвърждава промените (Баланс става 120)

    Резултат: Въпреки двете увеличения, крайният баланс е 120, а не 130. Увеличението от транзакция 1 е загубено.

  2. Мръсно четене (Dirty Read): Една транзакция чете незавършени промени на друга транзакция. Ако транзакцията, която е направила промените, бъде отменена, прочетените данни стават невалидни.

    Време Транзакция 1 Транзакция 2
    t1 Започва да променя Баланса (100 -> 110)
    t2 Чете Баланса (получава 110)
    t3 Отменя промените (Баланс се връща на 100)
    t4 Използва Баланса = 110 в изчисленията, въпреки че реалната стойност е 100

    Резултат: Транзакция 2 базира действията си на данни, които в крайна сметка не са били потвърдени.

  3. Неповторяемо четене (Non-Repeatable Read): По време на една транзакция, при повторно четене на същия ред се получават различни стойности, защото друга транзакция е потвърдила промени в този ред между четенията.

    Време Транзакция 1 Транзакция 2
    t1 Чете Баланса (получава 100)
    t2 Променя Баланса на 110 и потвърждава
    t3 Отново чете Баланса (получава 110 вместо 100)

    Резултат: Балансът се е променил в рамките на една и съща транзакция, което може да доведе до некоректни резултати.

  4. Фантомно четене (Phantom Read): Похоже на неповторяемо четене, но се отнася не за промяна на съществуващи редове, а за добавяне или изтриване на редове, които влияят на резултатите от заявка с предикат.

    Време Транзакция 1 Транзакция 2
    t1 Изпълнява заявката SELECT COUNT(*) FROM Orders WHERE Status = 'Pending' (получава 5)
    t2 Добавя нова заявка със статус 'Pending' и потвърждава
    t3 Отново изпълнява SELECT COUNT(*) FROM Orders WHERE Status = 'Pending' (получава 6)

    Резултат: При повторно изпълнение на заявката се появяват "фантомни" редове, които не са били при първото четене.

Тези аномалии се предотвратяват чрез използване на различни нива на изолация на транзакциите.