PRZECZYTAJ ZAANGAŻOWANE SNAPSHOT w SQL Server kontra SNAPSHOT

23

Badałem różnice między poziomami SQL Server READ COMMITTED SNAPSHOTa SNAPSHOTpoziomami izolacji i natknąłem się na następujący zasób:

Wybieranie poziomów izolacji opartych na wersjach wierszy

W przypadku większości aplikacji zaleca się odczytanie zatwierdzonej izolacji przy użyciu wersji wiersza zamiast izolacji migawki z następujących powodów:

  • Zajmuje mniej miejsca w tempdb niż izolacja migawkowa.

  • Izolacja migawki jest podatna na konflikty aktualizacji, które nie mają zastosowania do odczytu zatwierdzonej izolacji przy użyciu wersjonowania wierszy. Gdy transakcja uruchomiona w izolacji migawkowej odczytuje dane, które są następnie modyfikowane przez inną transakcję, aktualizacja przez migawkę tych samych danych powoduje konflikt aktualizacji, a transakcja kończy się i wycofuje. Nie jest to problem z odczytaniem zatwierdzonej izolacji przy użyciu wersjonowania wierszy.

Jestem nieco nowy w tych tematach, ale wydaje mi się, że nie rozumiem dwóch punktów z powyższego linku.

  1. Dlaczego przestrzeń tempdb miałaby być inna dla tych trybów? Czy jedno przechowuje bardziej szczegółowe wersje niż drugie?

  2. Dlaczego izolacja migawek jest bardziej podatna na konflikty aktualizacji?

John Russell
źródło

Odpowiedzi:

18
  1. READ COMMITTED SNAPSHOTużywa nowej migawki po każdej instrukcji. Oznacza to, że mniej wersji wierszy jest utrzymywanych przy życiu. (Oświadczenie, które zacytowałeś z dokumentów, jest nieco mylące, ponieważ sugeruje, że jest to zawsze prawda - dotyczy to tylko SNAPSHOTtransakcji długo działających ). Wersje wierszy migawkowych są tworzone podczas zapisu. Odczyty nie wpływają na to, co zostanie wprowadzone do tempdb. Pisarze nie są w stanie przewidzieć, jakie odczyty zostaną przeprowadzone w przyszłości. Czytelnicy wpływają tylko na to, co można oczyścić.
  2. Gdy SNAPSHOTtransakcja T1zapisuje do wiersza, który został zmodyfikowany przez inną transakcję T2w okresie między T1rozpoczęciem a T1próbą zapisu, instrukcja kończy się niepowodzeniem z błędem konfliktu aktualizacji. To optymistyczny model współbieżności. Z READ COMMITTED SNAPSHOT T1czekałby na T2zwolnienie blokady X na rzędzie i kontynuował normalnie.
usr
źródło
1
Czy w przypadku # 2 można bezpiecznie powiedzieć, że SNAPSHOT nie blokuje wyłącznie aktualizacji - opiera się tylko na wersjach wierszy?
John Russell,
1
@JohnRussell blokuje się wyłącznie w celu obsługi wycofania. Wszystkie zapisy muszą blokować X, aby zapewnić przywrócenie wiersza w przypadku wycofania.
usr
0

Jeszcze jedna różnica między migawką a odczytaną migawką zatwierdzoną jest następująca.

  1. Migawka

W pierwszej sesji

USTAW POZIOM IZOLACJI TRANU SNAPSHOT ROZPOCZNIJ TRAN WYBIERZ * OD TB1 ..... .....

W drugiej sesji

Zaktualizuj TB1 NAZWA = NAZWA + „test” Gdzie id = 1

W pierwszej sesji

WYBIERZ * Z TB1 - TO zwróci nazwę wartości dla ID = 1, nie nazwa + „test” COMMIT TRAN

W odczytanej zatwierdzonej migawce pierwszy wybór w sesji 1 zwróci nazwę dla id = 1, a drugi wybór zwróci nazwę + „test”.

Więc w izolacji migawek SQL SERVER wykonuje migawkę na początku transakcji i odczytuje z niej migawkę podczas całej transakcji.

W odczytanej zatwierdzonej migawce migawka jest pobierana dla każdej instrukcji SELECT podczas transakcji.

Artash Khachatryan
źródło