Understanding Row Versioning-Based Isolation Levels

Przechowywanie wersji wiersza jest ogólne ramy w SQL Server który jest używany do wykonywania następujących czynności:

  • Tworzenie dodaje and usunięte tabel w wyzwalaczy.Wersji są wszystkie wiersze, zmodyfikowane przez wyzwalacz.Dotyczy to wierszy, zmodyfikowane przez instrukcję, który uruchomił wyzwalacz, a także wszelkie modyfikacje danych wprowadzonych przez wyzwalacz.

  • Obsługują wiele zestawów wyników Active (MARS).Jeśli sesja MARS wysyła zestawienie modyfikacji danych (na przykład INSERT, UPDATE lub DELETE) na czas brak zestaw wyników aktywne, dotyczy instrukcja modyfikacji wierszy są wersji.

  • Obsługuje operacje indeksu, które określono opcję ONLINE.

  • Obsługa poziomów izolacji transakcji opartego na przechowywanie wersji wiersza:

    • Nowe wykonania odczytu popełnionych poziom izolacji, który używa wersji wiersza w celu zapewnienia spójności odczytać poziomu instrukcja.

    • Nowy poziom izolacji, migawka, aby zapewnić spójność odczytać poziomu transakcji.

The tempdb database must have enough space for the wersja store.Kiedy tempdb jest zapełniony, operacje aktualizacji spowoduje zatrzymanie generowania wersja i kontynuować powiodła się, ale istnieje odczytu operacji może się nie powieść, ponieważ określonego wiersza wersja, która jest już potrzebna.Ma to wpływ na operacje, takie jak wyzwalacze, Usługa MARS i indeksowania w trybie online.Aby uzyskać więcej informacji zobaczObciążenie zasób wersji wiersza.

Transakcje zatwierdzone odczytu i migawka przy użyciu wersji wiersza jest procesem dwuetapowym:

  1. zestaw lub obie bazy danych READ_COMMITTED_SNAPSHOT i ALLOW_SNAPSHOT_ISOLATION opcji ON.

  2. zestaw poziom izolacji odpowiedniej transakcji w aplikacji:

    • Gdy opcja READ_COMMITTED_SNAPSHOT bazy danych jest włączone, ustawienie poziom odczytu zadeklarowanej izolacji transakcji za pomocą wersji wiersza.

    • Gdy opcja ALLOW_SNAPSHOT_ISOLATION bazy danych jest włączone, transakcje zestaw poziom izolacji migawka.

Gdy READ_COMMITTED_SNAPSHOT lub ALLOW_SNAPSHOT_ISOLATION opcja bazy danych jest zestaw ON, SQL Server Database Engine numer sekwencji transakcji (XSN) przypisuje do każdej transakcji, który obsługuje dane przy użyciu wersji wiersza. Transakcje zaczynają się od czas wykonaniu instrukcja BEGIN TRANSACTION.Jednak uruchamia numer sekwencji transakcji z pierwszym odczytu lub zapisu operacji po instrukcja BEGIN TRANSACTION.Numer sekwencji transakcji jest zwiększany o jeden każdego czas je przypisano.

Gdy włączone są READ_COMMITTED_SNAPSHOT albo ALLOW_SNAPSHOT_ISOLATION opcje bazy danych, kopie logiczne (wersje) są obsługiwane dla wszystkich modyfikacji danych w bazie danych.Przy każdym wierszu jest modyfikowany przez konkretnej transakcji, wystąpienie programu Database Engine przechowuje wersje wcześniej zadeklarowana obraz na wiersz tempdb.Każda wersja jest oznaczona z numerem porządkowym transakcji, transakcji, która dokonane zmiany.Wersje zmodyfikowanych wierszy są powiązane, korzystając z listy łącze.Najnowsza wartość wiersza jest zawsze przechowywane w bieżącej bazie danych i powiązane wiersze wersji, przechowywane w tempdb.

Uwaga

Do modyfikacji dużych obiektów (LOBs) tylko zmieniony fragment jest kopiowany do magazynu wersja w tempdb.

Wiersz wersji są przetrzymywane wystarczająco długi, aby spełniać wymagania działająca w ramach poziomów izolacji na przechowywanie wersji wiersza transakcji.The Database Engine tracks the earliest useful transaction sequence number and periodically deletes all row versions stamped with transaction sequence numbers that are lower than the earliest useful sequence number.

Gdy obie opcje bazy danych są ustawione na wartość OFF, wersji są tylko wiersze, zmodyfikowany przez wyzwalacze lub sesji MARS i czytane przez operacje ONLINE indeksu.Te wersje wierszy są zwalniane, gdy nie są już potrzebne.Wątek tła jest wykonywany co pewien czas do usunięcia wiersza starych wersji.

Uwaga

Dla transakcji pracy krótkiej wersja zmodyfikowanych wierszy może uzyskać w pamięci podręcznej pula buforów bez pobierania zapisywane na dysku plików z tempdb bazy danych.W przypadku krótkotrwałe potrzebę wiersz wersji będzie pobrać po prostu usunięte z pula buforów i nie zawsze może ponieść obciążenie We/Wy.

Zachowanie podczas odczytu danych

Gdy uruchomiony odczytu danych opartych na przechowywanie wersji izolacji wierszy transakcji, operacji odczytu nie nabywają udostępnionego blokady (S) na odczytu danych i w związku z tym, czy nie transakcji blok w przypadku modyfikowania danych.Ponadto obciążenie związane z blokowania zasobów jest zminimalizowany zredukowana liczba blokad nabytych.Odczyt popełnionych izolację za pomocą wersji wiersza i izolacji migawka zostały opracowane w celu zapewnienia poziom instrukcja lub poziom transakcji odczytać consistencies danych wersji.

Wszystkie kwerendy, w tym transakcje uruchamiane na poziomach izolacji opartych na wersjach wierszy, uzyskują blokady Sch-S (stabilność schematu) podczas kompilowania i wykonywania.Z tego powodu kwerendy są blokowane, gdy współbieżna transakcja ma blokadę Sch-M (modyfikacja schematu) w tabeli.Na przykład operacja języka definicji danych (DDL) uzyskuje blokadę Sch-M przed zmodyfikowaniem informacji schematu tabeli.Transakcje kwerend, w tym uruchamiane na poziomie izolacji opartym na wersjach wierszy, są blokowane podczas próby uzyskania blokady Sch-S.I odwrotnie, kwerenda mająca blokadę Sch-S blokuje współbieżną transakcję, która próbuje uzyskać blokadę Sch-M.Aby uzyskać więcej informacji dotyczących zachowania blokad, zobacz temat Lock Compatibility (Database Engine).

Po uruchomieniu transakcji za pomocą poziom izolacji migawka, wystąpienie Database Engine rejestruje wszystkie aktualnie aktywnych transakcji. Gdy transakcja migawka czyta wiersz, który ma łańcuch wersja Database Engine następuje w łańcuchu i pobiera wiersza, gdzie jest numer sekwencji transakcji:

  • Najbardziej zbliżony do ale niższy niż numer sekwencyjny transakcji migawka odczytu w wierszu.

  • Nie ma na liście transakcji aktywne po rozpoczęciu transakcji migawka.

Ostatnią wersja każdego wiersza, które zostały zatwierdzone na pobieranie operacji odczytu przeprowadzonych nie tylko przez transakcję migawka czas uruchomić transakcję migawka.Zawiera transakcyjnie spójne migawka danych, jak go istniały w momencie rozpoczęcia transakcji.

Transakcje zatwierdzone do odczytu, przy użyciu wersji wiersza w bardzo działają w taki sam sposób.Różnica jest, że transakcja przekazana odczytu nie używa swój własny numer sekwencji transakcji podczas wybierania wersji wiersza.Za każdym razem instrukcja jest uruchomiona, transakcja przekazana odczytu odczytuje najnowsze numer sekwencji transakcji wydanych dla danego wystąpienie Database Engine. Jest to numer sekwencji transakcji używany do wybierania wersji wiersza poprawny dla tej instrukcja.Dzięki temu popełnionych odczytu transakcji zobaczyć dokładną kopią danych, ponieważ znajduje się na początku każdej instrukcja.

Uwaga

Nawet wtedy, gdy wiersz transakcji popełnionych odczytu za pomocą wersji zawiera transakcyjnie spójnego widoku danych poziom instrukcja, wiersz wersji generowane lub dostęp do tego typu transakcji są zachowywane do zakończenia transakcji.

Zachowanie przy modyfikowanie danych

W transakcji popełnionych odczytu przy użyciu wersji wiersza, zaznaczenie wiersze, które mają zostać zaktualizowane, jest wykonywane przy użyciu skanowania blokowania gdzie blokada aktualizacji (U) jest pobierana w wierszu danych, jak dane są odczytywane.Jest to taka sama, jak popełnionych odczytu transakcji, które nie korzystają z wersji wiersza.Jeśli wiersz danych nie spełnia kryteria aktualizacji, blokada aktualizacji jest wydawane w wierszu i następny wiersz jest zablokowany i zeskanowane.

Pobieranie blokady na danych przed wykonaniem zmian tylko do wymuszania ograniczeń działająca w ramach migawka izolacji transakcji podjąć optymistycznego podejście do modyfikacji danych.W przeciwnym razie blokady nie są nabywane na danych, aż do uzyskania danych ma zostać zmodyfikowany.Po wierszu danych spełnia kryteria aktualizacji, transakcji migawka weryfikuje, wiersz danych nie został zmodyfikowany przez jednoczesnych transakcji, która zatwierdzona po rozpoczęcia transakcji migawka.Jeśli wiersz danych została zmodyfikowana poza transakcji migawka występuje konflikt aktualizacji i migawka transakcja zostanie zakończona.Konflikt aktualizacji jest obsługiwany przez Database Engine i nie ma możliwości wyłączania wykrywania konfliktu aktualizacji.

Uwaga

Operacje aktualizacji działająca w ramach izolacji migawka wewnętrznie wykonuje odczytu izolacji zadeklarowanej w obszarze, jeśli transakcja migawka uzyskuje dostęp do dowolnego z następujących czynności:

Tabela z ograniczeniem klucz obcy.

Tabela, do którego odwołuje się ograniczenie klucz obcy z innej tabeli.

Widok indeksowany, odwoływanie się do więcej niż jedną tabela.

Jednak nawet w tych warunkach operacji aktualizacji będzie nadal sprawdzić, czy dane nie został zmodyfikowany przez inną transakcję.Jeśli dane zostały zmodyfikowane przez inną transakcję, transakcja migawka napotka konflikt aktualizacji i jest przerywane.

Zachowanie w podsumowanie

W poniższej tabela zestawiono różnice między migawka izolacji i odczytu izolację zadeklarowanej za pomocą wersji wiersza.

Właściwość

Poziom izolacji popełnionych odczytu przy użyciu wersji wiersza

Poziom izolacji migawka

Opcja bazy danych, które musi być ustawiona na ON, aby włączyć obsługę wymagane.

READ_COMMITTED_SNAPSHOT

ALLOW_SNAPSHOT_ISOLATION

W jaki sposób sesja żąda określonego typu wersji wiersza.

Użyj domyślnego poziomu izolacji popełnionych odczytu lub uruchom zestaw poziom izolacji transakcji instrukcję, aby określić poziom izolacji zaangażowane READ.Można to zrobić po rozpoczęciu transakcji.

Wymaga wykonania zestaw poziom izolacji TRANSACTION, aby określić poziom izolacji migawka przed rozpoczęciem transakcji.

Wersja dane odczytane przez wyrażenia.

Wszystkie dane, które zostały zatwierdzone przed rozpoczęciem każdej instrukcja.

Wszystkie dane, które zostały zatwierdzone przed rozpoczęciem każdej transakcji.

W jaki sposób aktualizacje są obsługiwane.

Przedstawione dane rzeczywiste, aby zaznaczyć wiersze, które mają zostać zaktualizowane, zostanie przywrócona z wersji wiersza i używa aktualizacji blokad dla wybranych wierszy danych.Nabywa wyłącznej blokady w wierszach rzeczywistych danych ma zostać zmodyfikowany.Wykrywanie konfliktów nie aktualizacji.

Korzysta z wersji wiersza, aby zaznaczyć wiersze, które mają zostać zaktualizowane.Próbuje uzyskać blokada na wyłączność danych rzeczywistych, wiersz ma zostać zmodyfikowany, a jeśli danych została zmodyfikowana przez inną transakcję, wystąpi konflikt aktualizacji i migawka transakcja zostanie zakończona.

Aktualizacja wykrywanie konfliktów.

Brak.

Zintegrowana obsługa.Nie można wyłączyć.