Większość forum i przykładów online zawsze sugeruje, aby mieć oba te elementy ALLOW_SNAPSHOT_ISOLATION
i READ_COMMITTED_SNAPSHOT
ustawić je na WŁĄCZONE, gdy ktoś zadaje migawkę, wersję wiersza lub podobne pytanie.
Wydaje mi się, że słowo SNAPSHOT w obu ustawieniach jest trochę mylące. Pomyślałem, że aby silnik bazy danych używał wersjonowania wierszy zamiast blokad dla domyślnego zachowania READ_COMMITTED, baza danych READ_COMMITTED_SNAPSHOT
jest ustawiona na ON bez względu na to, jakie ALLOW_SNAPSHOT_ISOLATION
ustawienie.
ALLOW_SNAPSHOT_ISOLATION
Jest ustawiona na ON wyłącznie w celu umożliwienia izolacji migawka podczas uruchamiania transakcji (np TRANSAKCJI izolacji migawka LEVEL SET) niezależnie od READ_COMMITTED_SNAPSHOT
ustawienia.
Jedynym powodem, dla którego te dwa ustawienia są ustawione na WŁĄCZONE, jest konieczność odczytania wersji wiersza ORAZ izolacji migawek.
Moje pytanie brzmi: czy moje rozumowanie jest w jakiś sposób nieprawidłowe? I że te dwa ustawienia muszą być zawsze ustawione razem na WŁĄCZONE (szczególnie w przypadku READ COMMITTED wersji wiersza)?
OK, wróciłem do domu i przetestowałem. Oto obserwacja.
Pierwszy test z obydwoma ustawieniami potwierdzonymi jako WYŁ.
Zapytanie 1
Zapytanie 2
W tym teście zapytanie 2 oczekuje na zatwierdzenie zapytania 1, dm_tran_locks DMV pokazuje, że blokada wyłączności na TABELI 1 została wywołana przez zapytanie 1.
Drugi test , wycofaj poprzednią transakcję, ustaw READ_COMMITTED_SNAPSHOT na ON, ale pozostaw ALLOW_SNAPSHOT_ISOLATION na OFF.
Uruchom zapytanie 1 i zapytanie 2. DMV pokazuje, że zapytanie 1 otrzymuje wyłączną blokadę, ale zapytanie 2 zwraca szczegóły z „Oryginalnym” bez zapytania 1 zatwierdzenia transakcji. Wygląda na to, że istnieje wersja READ_COMMITTED.
Dodanie
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
do zapytania 1 i zapytania 2 oraz uruchomienie zapytania 1 lub zapytania 2 zwraca błąd - Transakcja izolacji migawki nie powiodła się podczas uzyskiwania dostępu do bazy danych „TEST”, ponieważ izolacja migawki nie jest dozwolona w tej bazie danych. Użyj ALTER DATABASE, aby umożliwić izolację migawki.Trzeci test , wycofaj poprzednią transakcję. Ustaw READ_COMMITTED_SNAPSHOT w pozycji OFF i ALLOW_SNAPSHOT_ISOLATION w pozycji ON.
Uruchom zapytanie 1, a następnie zapytanie 2. DMV pokazuje wyłączną blokadę wywołaną przez zapytanie 1. Wydaje się, że zapytanie 2 oczekuje na zakończenie zapytania 1. Włączenie opcji ALLOW_SNAPSHOT_ISOLATION ON nie wydaje się włączać wersji dla READ COMMITTED.
Dodawanie
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
zarówno do zapytania 1, jak i zapytania 2. Uruchom zapytanie 1, a następnie zapytanie 2. Podczas gdy DMV pokazuje, że zapytanie 1 ma wyłączną blokadę, zapytanie 2 zwraca szczegóły za pomocą „Oryginału”. Wydaje się, że izolacja migawki jest na miejscu.Obserwacja z testu pokazuje, że
READ_COMMITTED_SNAPSHOT
samo włącza / wyłącza READ COMMITTED wersjonowanie wierszy, niezależnie odALLOW_SNAPSHOT_ISOLATION
ustawienia, i odwrotnie.źródło
Twoje zrozumienie jest prawidłowe. Podoba mi się krótka, czysta i prosta definicja stąd :
Wydaje się, że wiele nieporozumień pochodzi od samego SM. Na przykład tutaj mówią:
Ale wspomniana „izolacja migawki” nie jest równa zachowaniu transakcji, dla której
set transaction isolation level snapshot
jest stosowana.Jeśli chodzi o różnicę, ładne wyjaśnienie jest tutaj .
Prawdopodobnie byłoby lepiej, gdyby READ_COMMITTED_SNAPSHOT został nazwany READ_COMMITTED_ROW_VERSIONING lub coś w tym rodzaju. :)
źródło
Podoba mi się to podsumowanie od Microsoft :
źródło