Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Różnica między odczytem zatwierdzonym a odczytem powtarzalnym

Odczyt zatwierdzony to poziom izolacji, który gwarantuje, że wszelkie odczytane dane zostały zatwierdzone w tej chwili jest czytany. Po prostu ogranicza czytelnikowi możliwość zobaczenia jakichkolwiek pośrednich, niezaangażowanych, „brudnych” przeczytanych tekstów. Nie daje żadnej obietnicy, że jeśli transakcja ponownie wyda odczyt, znajdzie Taką samą dane, dane mogą ulec zmianie po ich odczytaniu.

Odczyt powtarzalny to wyższy poziom izolacji, który oprócz gwarancji poziomu zatwierdzonego odczytu gwarantuje również, że żadne odczytane dane nie mogą się zmienić , jeśli transakcja ponownie odczyta te same dane, znajdzie poprzednio odczytane dane na miejscu, niezmienione i dostępne do odczytu.

Kolejny poziom izolacji, możliwy do serializacji, zapewnia jeszcze silniejszą gwarancję:oprócz wszystkiego, co gwarantuje powtarzalność odczytu, gwarantuje również, że nie nowe dane można zobaczyć przy kolejnej lekturze.

Załóżmy, że masz tabelę T z kolumną C z jednym wierszem, powiedzmy, że ma wartość „1”. I pomyśl, że masz proste zadanie, takie jak:

BEGIN TRANSACTION;
SELECT * FROM T;
WAITFOR DELAY '00:01:00'
SELECT * FROM T;
COMMIT;

To proste zadanie polegające na wydaniu dwóch odczytów z tabeli T z jednominutową przerwą między nimi.

  • pod READ COMMITTED drugi SELECT może zwrócić dowolny dane. Równoczesna transakcja może aktualizować rekord, usuwać go, wstawiać nowe rekordy. Drugie zaznaczenie zawsze spowoduje wyświetlenie nowego dane.
  • w obszarze READ REPEATABLE READ drugi SELECT gwarantuje wyświetlenie przynajmniej wierszy, które zostały zwrócone z pierwszego SELECT niezmienione . Nowe wiersze mogą zostać dodane przez jednoczesną transakcję w ciągu tej minuty, ale istniejących wierszy nie można usunąć ani zmienić.
  • pod odczytami SERIALIZABLE drugi wybór gwarantuje zobaczenie dokładnie te same rzędy co pierwsze. Żaden wiersz nie może się zmienić ani usunąć, ani nowe wiersze nie mogą zostać wstawione przez jednoczesną transakcję.

Jeśli zastosujesz się do powyższej logiki, szybko zorientujesz się, że transakcje SERIALIZOWANE, chociaż mogą ułatwić Ci życie, zawsze całkowicie blokują każda możliwa współbieżna operacja, ponieważ wymagają one, aby nikt nie mógł modyfikować, usuwać ani wstawiać żadnego wiersza. Domyślny poziom izolacji transakcji .Net System.Transactions zakres jest możliwy do serializacji, co zwykle wyjaśnia fatalną wydajność, jaką daje.

I wreszcie, jest jeszcze poziom izolacji SNAPSHOT. Poziom izolacji SNAPSHOT zapewnia te same gwarancje, co możliwość serializacji, ale nie wymaga, aby żadna współbieżna transakcja nie mogła modyfikować danych. Zamiast tego zmusza każdego czytelnika do obejrzenia własnej wersji świata (to własna „migawka”). Dzięki temu jest bardzo łatwy w programowaniu i bardzo skalowalny, ponieważ nie blokuje jednoczesnych aktualizacji. Jednak ta korzyść ma swoją cenę:dodatkowe zużycie zasobów serwera.

Dodatkowe odczyty:

  • Poziomy izolacji w silniku bazy danych
  • Efekty współbieżności
  • Wybieranie poziomów izolacji opartych na wersjonowaniu wierszy


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wyświetlić wszystkie domyślne ograniczenia z kolumnami w bazie danych SQL Server — samouczek SQL Server/TSQL — część 92

  2. Procedura oczekuje parametru, którego nie podano

  3. Jak TRY_CAST() działa w SQL Server

  4. Konwertuj format daty na format DD/MMM/RRRR w SQL Server

  5. Poznaj bazę danych przywracania SQL Server z odzyskiwaniem i bez opcji odzyskiwania