Advertisement
JanuszKowalski123

brudny odczyt

May 14th, 2024 (edited)
16
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.62 KB | None | 0 0
  1. "Brudny odczyt" (ang. dirty read) to zjawisko występujące w transakcyjnych systemach baz danych, w którym jedna transakcja odczytuje dane zmieniane przez inną transakcję, która jeszcze nie została zatwierdzona (commit) lub została zatwierdzona, ale nie została zapisana (persisted) na dysku. Innymi słowy, "brudny odczyt" pozwala jednej transakcji odczytywać niezatwierdzone lub niezapisane zmiany dokonane przez inną transakcję.
  2.  
  3. W systemie Microsoft SQL Server brudny odczyt może wystąpić, gdy jedna transakcja wykonuje odczyt danych, które zostały zapisane przez inną transakcję, ale jeszcze nie zostały zatwierdzone. Jest to możliwe, gdy jedna transakcja rozpocznie odczyt danych, a druga transakcja dokona zmian w tych danych, ale jeszcze ich nie zatwierdzi. W takiej sytuacji, jeśli pierwsza transakcja kontynuuje odczyt danych, odczyta zmienione dane, chociaż mogą być one niedokładne lub nawet tymczasowe.
  4.  
  5. Brudny odczyt może prowadzić do nieprzewidywalnych rezultatów i problemów spójności danych w systemie baz danych. Dlatego też, w przypadku aplikacji wymagających wysokiego poziomu spójności danych, należy unikać korzystania z brudnego odczytu poprzez ustawienie odpowiednich poziomów izolacji transakcji, takich jak READ COMMITTED lub wyższych.
  6.  
  7.  
  8. Aby zilustrować "brudny odczyt" na przykładzie bazy danych, najpierw utwórzmy dwie transakcje. Pierwsza transakcja będzie aktualizować status urządzenia, a druga będzie próbować odczytać ten status przed zakończeniem transakcji pierwszej, symulując tym samym "brudny odczyt".
  9.  
  10.  
  11. -- Transakcja 1: Aktualizacja statusu urządzenia
  12. BEGIN TRANSACTION;
  13. UPDATE Renewable_Energy_Devices
  14. SET device_status = 3
  15. WHERE device_id = '00000000000000000000000000';
  16.  
  17. -- Symulacja opóźnienia w transakcji 1
  18. WAITFOR DELAY '00:00:10';
  19.  
  20. -- Transakcja 2: Odczyt statusu urządzenia
  21. BEGIN TRANSACTION;
  22. SELECT device_status
  23. FROM Renewable_Energy_Devices
  24. WHERE device_id = '00000000000000000000000000';
  25.  
  26.  
  27.  
  28. W powyższym przykładzie:
  29.  
  30. Transakcja 1 aktualizuje status urządzenia o identyfikatorze '00000000000000000000000000' na wartość 3.
  31. Następnie symulowane jest opóźnienie przez 10 sekund.
  32. W międzyczasie transakcja 2 próbuje odczytać status tego samego urządzenia przed zakończeniem transakcji 1.
  33. Jeśli transakcja 2 zakończy się przed zakończeniem transakcji 1, wówczas odczyta zmienioną wartość statusu urządzenia (3), nawet jeśli transakcja 1 nie została jeszcze zatwierdzona (commit). Ten efekt jest nazywany "brudnym odczytem", ponieważ transakcja 2 odczytuje zmiany, które nie zostały jeszcze zatwierdzone przez inną transakcję.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement