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

SAVE TRANSACTION

Termin Definicja
SAVE TRANSACTION

SAVE TRANSACTION tworzy punkt zapisu wewnątrz transakcji, do którego można wycofać zmiany bez jej pełnego anulowania.

Punkt zapisu w transakcji T-SQL

SAVE TRANSACTION jest instrukcją języka T-SQL używanego przez Microsoft SQL Server. Tworzy nazwany punkt zapisu w aktywnej transakcji. Punkt zapisu nie jest osobną transakcją i nie powoduje zatwierdzenia zmian. Pozwala jedynie wskazać miejsce, do którego można później cofnąć część operacji wykonanych od początku transakcji albo od wcześniejszego punktu zapisu.

Podstawowa postać polecenia to SAVE TRANSACTION nazwa_punktu. Nazwa punktu zapisu identyfikuje miejsce w dzienniku transakcji. Po jego utworzeniu dalsze instrukcje modyfikujące dane nadal należą do tej samej transakcji. Ostateczne zatwierdzenie wykonuje dopiero COMMIT TRANSACTION, a anulowanie całej transakcji — ROLLBACK TRANSACTION bez nazwy punktu.

Cofanie części operacji za pomocą ROLLBACK

Aby wycofać zmiany wykonane po punkcie zapisu, należy użyć ROLLBACK TRANSACTION nazwa_punktu. SQL Server cofa wtedy operacje od wskazanego punktu do bieżącego miejsca, ale pozostawia aktywną transakcję. Instrukcje wykonane przed utworzeniem punktu zapisu pozostają w transakcji i nie są przez takie częściowe wycofanie anulowane.

Przykładowy przebieg może obejmować rozpoczęcie transakcji, zapisanie punktu etap_danych, wykonanie kilku modyfikacji, a następnie wycofanie tylko ostatniego etapu. Po częściowym wycofaniu można wykonać inne instrukcje i dopiero później zatwierdzić całość. Samo ROLLBACK TRANSACTION do punktu zapisu nie zmniejsza wartości @@TRANCOUNT. Oznacza to, że nie kończy transakcji i nie zastępuje pełnego wycofania lub zatwierdzenia.

Zakres działania i ograniczenia punktów zapisu

Punkty zapisu są użyteczne w procedurach składowanych, które mogą być wywoływane zarówno wewnątrz istniejącej transakcji, jak i w kodzie bez wcześniejszej transakcji. Procedura może sprawdzić @@TRANCOUNT, rozpocząć własną transakcję, gdy nie ma transakcji nadrzędnej, albo utworzyć punkt zapisu, gdy działa już w transakcji wywołującego. Dzięki temu błąd lokalnego fragmentu pracy nie musi automatycznie anulować wszystkich wcześniejszych zmian.

W SQL Server nazwa punktu zapisu jest istotna również przy wielokrotnym użyciu tej samej nazwy. Jeżeli w jednej transakcji ponownie wykona się SAVE TRANSACTION z identyczną nazwą, późniejsze odwołanie do tej nazwy wskazuje najnowszy punkt zapisu. Częściowe wycofanie nie przywraca automatycznie wszystkich właściwości środowiska do wcześniejszego stanu, dlatego kod powinien osobno kontrolować wartości zmiennych, obsługę błędów oraz kolejność wykonywanych operacji.

Obsługa błędów i kontrola stanu transakcji

Przy implementacji obsługi błędów ważna jest funkcja XACT_STATE(). Wartość 1 oznacza transakcję aktywną i możliwą do zatwierdzenia, 0 oznacza brak aktywnej transakcji, a wartość -1 wskazuje transakcję niezatwierdzalną. W tym ostatnim stanie SQL Server nie pozwala wykonać operacji wymagających dalszego zapisu w dzienniku, dlatego powrót do punktu zapisu może być niemożliwy. W praktyce pozostaje wtedy pełne ROLLBACK TRANSACTION.

Instrukcja SAVE TRANSACTION nie zastępuje kontroli wyjątków w konstrukcji TRY...CATCH. Kod powinien rozróżniać błąd, po którym można bezpiecznie cofnąć fragment do punktu zapisu, od błędu, który unieważnił całą transakcję. Należy też pamiętać, że punkty zapisu nie są obsługiwane w transakcjach rozproszonych, w tym w transakcjach lokalnych promowanych do rozproszonych. Dodatkowo częściowe wycofanie może zwolnić blokady uzyskane po punkcie zapisu, lecz nie należy zakładać, że cofnięte zostaną wszystkie blokady związane z eskalacją lub konwersją blokady.

W środowisku serwerowym poprawna diagnoza problemu z SAVE TRANSACTION wymaga sprawdzenia treści procedury, wartości @@TRANCOUNT, wyniku XACT_STATE(), ustawienia SET XACT_ABORT oraz rodzaju transakcji. Błędna obsługa tych elementów może prowadzić do pozostawienia otwartej transakcji, blokowania innych sesji albo nieoczekiwanego wycofania całego zestawu zmian.

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