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