Ce anomalii pot apărea în timpul executării tranzacțiilor paralele?
sobes.tech AI
Răspuns de la AI
Atunci când se execută tranzacții în paralel, pot apărea următoarele anomalii:
-
Update pierdut (Lost Update): O tranzacție suprascrie modificările altei tranzacții înainte ca acestea să fie confirmate.
Timp Tranzacția 1 Tranzacția 2 t1 Citește valoarea Sold (de exemplu, 100) t2 Citește valoarea Sold (de exemplu, 100) t3 Crește Sold cu 10 (Sold = 110) t4 Crește Sold cu 20 (Sold = 120) t5 Confirmă modificările (Sold devine 110) t6 Confirmă modificările (Sold devine 120) Rezultat: În ciuda celor două creșteri, valoarea finală a Soldului este 120, nu 130. Creșterea de către Tranzacția 1 s-a pierdut.
-
Citire murdară (Dirty Read): O tranzacție citește modificări nesalvate ale altei tranzacții. Dacă tranzacția care a făcut modificări se va răzgândi, datele citite vor fi invalide.
Timp Tranzacția 1 Tranzacția 2 t1 Începe modificarea Sold (100 -> 110) t2 Citește Sold (obține 110) t3 Răzgândește modificarea (Sold revine la 100) t4 Folosește Sold = 110 în calcule, deși valoarea reală este 100 Rezultat: Tranzacția 2 își bazează acțiunile pe date care, în final, nu au fost confirmate.
-
Citire nerepetabilă (Non-Repeatable Read): În timpul unei tranzacții, citirea aceleiași rânduri de mai multe ori produce valori diferite, deoarece o altă tranzacție a confirmat modificări ale acelei rânduri între citiri.
Timp Tranzacția 1 Tranzacția 2 t1 Citește Sold (obține 100) t2 Modifică Sold la 110 și confirmă t3 Citește din nou Sold (obține 110 în loc de 100) Rezultat: Sold-ul s-a schimbat în cadrul aceleiași tranzacții, ceea ce poate duce la rezultate incorecte.
-
Citire fantomă (Phantom Read): Similar cu citirea nerepetabilă, dar se referă la adăugarea sau ștergerea de rânduri care afectează rezultatele unei interogări cu predicat.
Timp Tranzacția 1 Tranzacția 2 t1 Execută interogarea SELECT COUNT(*) FROM Orders WHERE Status = 'Pending'(obține 5)t2 Adaugă o nouă comandă cu statusul 'Pending' și confirmă t3 Execută din nou SELECT COUNT(*) FROM Orders WHERE Status = 'Pending'(obține 6)Rezultat: La executarea repetată a interogării apar rânduri "fantomă" care nu erau prezente la prima citire.
Aceste anomalii sunt prevenite prin utilizarea diferitelor niveluri de izolare a tranzacțiilor.