Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

SNAPSHOT

Termin Definicja
SNAPSHOT

SNAPSHOT to poziom izolacji transakcji oparty na wersjonowaniu wierszy, eliminujący blokady odczytu.

Snapshot jako poziom izolacji transakcji w SQL Server

SNAPSHOT to poziom izolacji transakcji dostępny w Microsoft SQL Server, oparty na wersjonowaniu wierszy. Transakcja działająca w tym trybie odczytuje dane z punktu w czasie ustalonego przy rozpoczęciu transakcji, a niekoniecznie z chwili wykonania każdego pojedynczego zapytania. Dzięki temu kolejne odczyty tych samych wierszy w ramach jednej transakcji mogą zwrócić spójny obraz danych, nawet gdy inne transakcje w międzyczasie zatwierdzają zmiany.

W standardowym modelu blokowania odczyt może oczekiwać na zakończenie operacji modyfikującej dane. Przy izolacji SNAPSHOT odczyt korzysta z wcześniejszej wersji wiersza i zasadniczo nie zakłada blokad odczytu, które zatrzymywałyby równoległe modyfikacje. Nie oznacza to jednak całkowitego braku blokad w silniku. SQL Server nadal stosuje blokady związane z zapisem, zatwierdzaniem transakcji, strukturami metadanych oraz innymi elementami kontroli współbieżności.

Włączenie i użycie mechanizmu

Obsługa poziomu SNAPSHOT musi zostać włączona na poziomie konkretnej bazy danych. Służy do tego ustawienie ALLOW_SNAPSHOT_ISOLATION, na przykład: ALTER DATABASE NazwaBazy SET ALLOW_SNAPSHOT_ISOLATION ON;. Zmiana konfiguracji może wymagać oczekiwania na zakończenie aktywnych transakcji, zależnie od aktualnego stanu bazy i użytych opcji. Samo włączenie mechanizmu nie powoduje, że wszystkie transakcje automatycznie zaczynają działać w tym trybie.

Po aktywowaniu opcji sesja może wybrać izolację poleceniem SET TRANSACTION ISOLATION LEVEL SNAPSHOT;. Następnie transakcję uruchamia się zwykle przez BEGIN TRANSACTION, wykonuje zapytania odczytujące dane, a na końcu stosuje COMMIT albo ROLLBACK. Poziom izolacji obowiązuje dla kolejnych instrukcji tej sesji, dopóki nie zostanie zmieniony. Jeżeli aplikacja korzysta z puli połączeń, ustawienie poziomu izolacji powinno być kontrolowane, ponieważ połączenie może zostać ponownie użyte przez inny fragment programu.

SNAPSHOT należy odróżnić od opcji READ_COMMITTED_SNAPSHOT. Ta druga zmienia sposób realizacji domyślnego poziomu READ COMMITTED w danej bazie, natomiast SNAPSHOT jest jawnie wybieranym poziomem izolacji dla transakcji. W trybie SNAPSHOT obraz danych jest związany z początkiem transakcji. Przy READ COMMITTED SNAPSHOT poszczególne instrukcje otrzymują własny punkt odczytu, więc dwa zapytania w jednej transakcji mogą obserwować różne, późniejsze wersje danych.

Wersje wierszy, spójność i konflikty zapisu

Gdy transakcja modyfikuje wiersz, SQL Server zachowuje informacje potrzebne do odtworzenia jego wcześniejszego stanu. Wersje wierszy są przechowywane w magazynie wersji, którego lokalizacja zależy od konfiguracji SQL Server; w typowej konfiguracji wykorzystuje się bazę tempdb. Odczytująca transakcja SNAPSHOT może pobrać wersję odpowiadającą momentowi rozpoczęcia transakcji zamiast czekać na zwolnienie blokady przez transakcję zapisującą. Wymaga to monitorowania obciążenia tempdb, ponieważ długie transakcje mogą utrzymywać wersje przez dłuższy czas.

Izolacja SNAPSHOT zapewnia spójność odczytu, ale nie rozwiązuje wszystkich problemów współbieżności. Jeżeli transakcja SNAPSHOT odczyta wiersz, a następnie inna transakcja zmieni ten sam wiersz i zatwierdzi zmianę, pierwsza transakcja może otrzymać konflikt aktualizacji, gdy spróbuje zapisać nieaktualną wersję. SQL Server zgłasza w takiej sytuacji błąd konfliktu aktualizacji, powszechnie identyfikowany numerem 3960. Aplikacja musi wtedy obsłużyć wyjątek, wycofać transakcję i ewentualnie ponowić całą operację po ponownym odczycie danych.

Ważne jest także właściwe zarządzanie czasem trwania transakcji. Otwarte transakcje obejmujące długie operacje, oczekiwanie na użytkownika albo komunikację z innym systemem mogą zwiększać ilość przechowywanych wersji i obciążenie magazynu wersji. Przy analizie problemów należy sprawdzić czas trwania transakcji, aktywność sesji, wykorzystanie tempdb, występowanie konfliktów aktualizacji oraz zapytania, które niepotrzebnie obejmują zbyt szeroki zakres pracy.

Znaczenie dla diagnostyki komputerów i baz danych

W środowisku korzystającym z SQL Server nieprawidłowe działanie SNAPSHOT może objawiać się pozornie sprzecznymi wynikami zapytań, błędami aktualizacji albo wzrostem zajętości tempdb. Sama obecność opcji ALLOW_SNAPSHOT_ISOLATION nie dowodzi jednak, że konkretna aplikacja używa tego poziomu. Podczas diagnostyki trzeba sprawdzić polecenia ustawiające izolację, konfigurację połączeń, dzienniki aplikacji oraz czas życia transakcji. Należy również rozróżnić blokadę od konfliktu wersji: pierwsza może prowadzić do oczekiwania, a drugi do wycofania operacji i błędu przy zapisie.

W przypadku problemu z aplikacją należy ustalić, czy odczyt ma być spójny dla całej transakcji, czy tylko dla pojedynczych instrukcji. Wybór SNAPSHOT wpływa na sposób obsługi retry, wymagania dotyczące magazynu wersji i zachowanie kodu wykonującego aktualizacje. Przydatne jest rejestrowanie identyfikatora transakcji, czasu rozpoczęcia, czasu zakończenia, rodzaju operacji oraz numeru błędu SQL Server. Takie dane pozwalają odtworzyć kolejność zdarzeń i stwierdzić, czy przyczyną jest konflikt zapisu, zbyt długa transakcja, niewłaściwa konfiguracja bazy czy błąd w logice aplikacji.

Diagnostyka powinna obejmować także sprawdzenie planów wykonania i zakresu skanowanych danych, ponieważ szerokie zapytania zwiększają czas utrzymywania transakcji. Zmiana poziomu izolacji bez analizy logiki zapisu może usunąć część oczekiwania na blokady, ale jednocześnie ujawnić konflikty, których aplikacja wcześniej nie obsługiwała. Dlatego SNAPSHOT należy traktować jako element całego modelu transakcyjnego SQL Server, a nie jako przełącznik gwarantujący automatyczne przyspieszenie każdej operacji.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę