Sobes.tech
Middle+

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.