Sobes.tech
Middle+
208

Jakie anomalie mogą wystąpić podczas wykonywania transakcji równoległych?

Odpowiedź od AI

sobes.tech AI

Podczas równoczesnego wykonywania transakcji mogą wystąpić następujące anomalie:

  1. Utracona aktualizacja (Lost Update): Jedna transakcja nadpisuje zmiany innej transakcji zanim te zmiany zostaną zatwierdzone.

    Czas Transakcja 1 Transakcja 2
    t1 Odczytuje wartość salda (np. 100)
    t2 Odczytuje wartość salda (np. 100)
    t3 Zwiększa saldo o 10 (Saldo = 110)
    t4 Zwiększa saldo o 20 (Saldo = 120)
    t5 Zatwierdza zmiany (Saldo staje się 110)
    t6 Zatwierdza zmiany (Saldo staje się 120)

    Wynik: Pomimo dwóch zwiększeń, końcowa wartość salda to 120, a nie 130. Aktualizacja z transakcji 1 została utracona.

  2. Brudne odczytanie (Dirty Read): Transakcja odczytuje niezatwierdzone zmiany innej transakcji. Jeśli transakcja, która dokonała zmian, zostanie cofnięta, odczytane dane będą nieprawidłowe.

    Czas Transakcja 1 Transakcja 2
    t1 Rozpoczyna zmianę salda (100 -> 110)
    t2 Odczytuje saldo (otrzymuje 110)
    t3 Cofnięcie zmiany (saldo wraca do 100)
    t4 Używa salda = 110 w obliczeniach, mimo że rzeczywista wartość to 100

    Wynik: Transakcja 2 opiera swoje działania na danych, które ostatecznie nie zostały zatwierdzone.

  3. Odczyt niepowtarzalny (Non-Repeatable Read): Podczas jednej transakcji, ponowne odczytanie tej samej linii daje różne wartości, ponieważ inna transakcja zatwierdziła zmiany tej linii między odczytami.

    Czas Transakcja 1 Transakcja 2
    t1 Odczytuje saldo (otrzymuje 100)
    t2 Zmienia saldo na 110 i zatwierdza
    t3 Ponownie odczytuje saldo (otrzymuje 110 zamiast oczekiwanych 100)

    Wynik: Saldo zmieniło się w ramach jednej transakcji, co może prowadzić do niepoprawnych wyników.

  4. Odczyt fantomowy (Phantom Read): Podobny do odczytu niepowtarzalnego, ale dotyczy dodawania lub usuwania linii, które wpływają na wyniki zapytania z predykatem.

    Czas Transakcja 1 Transakcja 2
    t1 Wykonuje zapytanie SELECT COUNT(*) FROM Orders WHERE Status = 'Pending' (otrzymuje 5)
    t2 Dodaje nowe zamówienie ze statusem 'Pending' i zatwierdza
    t3 Ponownie wykonuje SELECT COUNT(*) FROM Orders WHERE Status = 'Pending' (otrzymuje 6)

    Wynik: Przy ponownym wykonaniu zapytania pojawiają się "fantomowe" linie, których nie było przy pierwszym odczycie.

Anomalie te można zapobiec, stosując różne poziomy izolacji transakcji.