Badałem różnice między poziomami SQL Server READ COMMITTED SNAPSHOT
a SNAPSHOT
poziomami 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.
Dlaczego przestrzeń tempdb miałaby być inna dla tych trybów? Czy jedno przechowuje bardziej szczegółowe wersje niż drugie?
Dlaczego izolacja migawek jest bardziej podatna na konflikty aktualizacji?
źródło
Jeszcze jedna różnica między migawką a odczytaną migawką zatwierdzoną jest następująca.
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.
źródło