Какви аномалии могат да възникнат при изпълнение на паралелни транзакции?
sobes.tech AI
Отговор от AI
Когато транзакциите се изпълняват паралелно, могат да възникнат следните аномалии:
-
Загубена актуализация (Lost Update): Една транзакция презаписва промените на друга транзакция, преди те да бъдат потвърдени.
Време Транзакция 1 Транзакция 2 t1 Чете стойността на Баланса (например 100) t2 Чете стойността на Баланса (например 100) t3 Увеличава Баланса с 10 (Баланс = 110) t4 Увеличава Баланса с 20 (Баланс = 120) t5 Потвърждава промените (Баланс става 110) t6 Потвърждава промените (Баланс става 120) Резултат: Въпреки двете увеличения, крайният баланс е 120, а не 130. Увеличението от транзакция 1 е загубено.
-
Мръсно четене (Dirty Read): Една транзакция чете незавършени промени на друга транзакция. Ако транзакцията, която е направила промените, бъде отменена, прочетените данни стават невалидни.
Време Транзакция 1 Транзакция 2 t1 Започва да променя Баланса (100 -> 110) t2 Чете Баланса (получава 110) t3 Отменя промените (Баланс се връща на 100) t4 Използва Баланса = 110 в изчисленията, въпреки че реалната стойност е 100 Резултат: Транзакция 2 базира действията си на данни, които в крайна сметка не са били потвърдени.
-
Неповторяемо четене (Non-Repeatable Read): По време на една транзакция, при повторно четене на същия ред се получават различни стойности, защото друга транзакция е потвърдила промени в този ред между четенията.
Време Транзакция 1 Транзакция 2 t1 Чете Баланса (получава 100) t2 Променя Баланса на 110 и потвърждава t3 Отново чете Баланса (получава 110 вместо 100) Резултат: Балансът се е променил в рамките на една и съща транзакция, което може да доведе до некоректни резултати.
-
Фантомно четене (Phantom Read): Похоже на неповторяемо четене, но се отнася не за промяна на съществуващи редове, а за добавяне или изтриване на редове, които влияят на резултатите от заявка с предикат.
Време Транзакция 1 Транзакция 2 t1 Изпълнява заявката SELECT COUNT(*) FROM Orders WHERE Status = 'Pending'(получава 5)t2 Добавя нова заявка със статус 'Pending' и потвърждава t3 Отново изпълнява SELECT COUNT(*) FROM Orders WHERE Status = 'Pending'(получава 6)Резултат: При повторно изпълнение на заявката се появяват "фантомни" редове, които не са били при първото четене.
Тези аномалии се предотвратяват чрез използване на различни нива на изолация на транзакциите.