Udostępnij za pomocą


WYCOFYWANIE TRANSAKCJI (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Magazyn w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Ta instrukcja powoduje wycofanie jawnej lub niejawnej transakcji na początku transakcji lub do punktu zapisu wewnątrz transakcji. Możesz użyć ROLLBACK TRANSACTION polecenia , aby wymazać wszystkie modyfikacje danych wprowadzone od początku transakcji lub do punktu zapisu. Zwalnia również zasoby przechowywane przez transakcję.

Wycofywanie transakcji nie obejmuje zmian wprowadzonych w zmiennych lokalnych ani zmiennych tabeli. Te zmiany nie są usuwane przez tę instrukcję.

Transact-SQL konwencje składni

Syntax

Składnia dla programu SQL Server, usługi Azure SQL Database i bazy danych SQL Fabric.

ROLLBACK { TRAN | TRANSACTION }
    [ transaction_name | @tran_name_variable
    | savepoint_name | @savepoint_variable ]
[ ; ]

Składnia magazynu danych sieci szkieletowej, usługi Azure Synapse Analytics i równoległej bazy danych magazynu danych.

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

Nazwa przypisana do transakcji na .BEGIN TRANSACTION transaction_name muszą być zgodne z regułami identyfikatorów, ale są używane tylko 32 pierwsze znaki nazwy transakcji. W przypadku zagnieżdżania transakcji transaction_name musi być nazwą najbardziej zewnętrznej BEGIN TRANSACTION instrukcji. transaction_name zawsze uwzględnia wielkość liter, nawet jeśli wystąpienie programu SQL Server nie uwzględnia wielkości liter.

@tran_name_variable

Nazwa zmiennej zdefiniowanej przez użytkownika zawierająca prawidłową nazwę transakcji. Zmienna musi być zadeklarowana przy użyciu typu danych char, varchar, nchar lub nvarchar .

savepoint_name

savepoint_name z instrukcji SAVE TRANSACTION . savepoint_name muszą być zgodne z regułami dotyczącymi identyfikatorów. Użyj savepoint_name , gdy wycofanie warunkowe powinno mieć wpływ tylko na część transakcji.

@savepoint_variable

Nazwa zmiennej zdefiniowanej przez użytkownika zawierającej prawidłową nazwę punktu zapisywania. Zmienna musi być zadeklarowana przy użyciu typu danych char, varchar, nchar lub nvarchar .

Obsługa błędów

Instrukcja ROLLBACK TRANSACTION nie generuje żadnych komunikatów dla użytkownika. Jeśli w procedurach składowanych lub wyzwalaczach są wymagane ostrzeżenia, użyj RAISERROR instrukcji or PRINT . RAISERROR jest preferowaną instrukcją wskazującą błędy.

Remarks

ROLLBACK TRANSACTION bez savepoint_name lub transaction_name wraca do początku transakcji. W przypadku zagnieżdżania transakcji ta sama instrukcja powoduje wycofanie wszystkich transakcji wewnętrznych do najbardziej zewnętrznej BEGIN TRANSACTION instrukcji. W obu przypadkach ROLLBACK TRANSACTION dekrementuje funkcję systemową @@TRANCOUNT do 0. ROLLBACK TRANSACTION <savepoint_name> nie powoduje dekrementacji @@TRANCOUNT.

ROLLBACK TRANSACTION nie może odwoływać się do savepoint_name w transakcjach rozproszonych uruchomionych jawnie lub BEGIN DISTRIBUTED TRANSACTION eskalowanych z transakcji lokalnej.

Nie można wycofać transakcji po COMMIT TRANSACTION wykonaniu instrukcji, z wyjątkiem sytuacji, gdy COMMIT TRANSACTION jest skojarzona z zagnieżdżonym transakcją zawartą w transakcji, która jest wycofana. W tym przypadku zagnieżdżona transakcja zostanie wycofana, nawet jeśli została wystawiona COMMIT TRANSACTION dla niej.

W ramach transakcji zduplikowane nazwy punktów zapisywania są dozwolone, ale ROLLBACK TRANSACTION użycie zduplikowane nazwy punktu zapisywania jest przywracane tylko do najnowszej SAVE TRANSACTION przy użyciu tej nazwy punktu zapisywania.

Interoperability

W procedurach ROLLBACK TRANSACTION składowanych instrukcje bez savepoint_name lub transaction_name wycofać wszystkie instrukcje do najbardziej zewnętrznego BEGIN TRANSACTION. ROLLBACK TRANSACTION Instrukcja w procedurze składowanej, która powoduje@@TRANCOUNT, że ma inną wartość po zakończeniu procedury składowanej niż @@TRANCOUNT wartość wywołana procedura składowana powoduje wygenerowanie komunikatu informacyjnego. Ten komunikat nie ma wpływu na kolejne przetwarzanie.

Jeśli element ROLLBACK TRANSACTION jest wystawiany w wyzwalaczu:

  • Wszystkie modyfikacje danych wprowadzone w tym punkcie w bieżącej transakcji zostaną wycofane, w tym wszelkie wprowadzone przez wyzwalacz.

  • Wyzwalacz kontynuuje wykonywanie pozostałych instrukcji po instrukcji ROLLBACK . Jeśli którakolwiek z tych instrukcji modyfikuje dane, modyfikacje nie są wycofane. Żadne zagnieżdżone wyzwalacze nie są wyzwalane przez wykonanie tych pozostałych instrukcji.

  • Instrukcje w partii po instrukcji, która wyzwoliła wyzwalacz, nie są wykonywane.

@@TRANCOUNT parametr jest zwiększany o jeden podczas wprowadzania wyzwalacza, nawet w trybie automatycznego zatwierdzenia. (System traktuje wyzwalacz jako domniemaną transakcję zagnieżdżonych).

ROLLBACK TRANSACTION instrukcje w procedurach składowanych nie mają wpływu na kolejne instrukcje w partii, która nazwała procedurę; kolejne instrukcje w partii są wykonywane. ROLLBACK TRANSACTION instrukcje w wyzwalaczach kończą partię zawierającą instrukcję, która wyzwoliła wyzwalacz; kolejne instrukcje w partii nie są wykonywane.

Wpływ kursorów ROLLBACK na kursory jest definiowany przez następujące trzy reguły:

  • Po CURSOR_CLOSE_ON_COMMIT ustawieniu ON, ROLLBACK zamyka się, ale nie cofa przydziału wszystkich otwartych kursorów.

  • W CURSOR_CLOSE_ON_COMMIT zestawie OFFROLLBACK nie ma wpływu na otwarte synchroniczne STATIC lub INSENSITIVE kursory ani kursory asynchroniczneSTATIC, które zostały w pełni wypełnione. Otwarte kursory dowolnego innego typu są zamknięte, ale nie cofnięto przydziału.

  • Błąd, który kończy partię i generuje wewnętrzny przydział wycofywania powoduje cofnięcie przydziału wszystkich kursorów zadeklarowanych w partii zawierającej instrukcję błędu. Wszystkie kursory są cofane niezależnie od typu lub ustawienia .CURSOR_CLOSE_ON_COMMIT Obejmuje to kursory zadeklarowane w procedurach składowanych wywoływanych przez partię błędów. Kursory zadeklarowane w partii przed partią błędów podlegają dwóm pierwszym regułom. Błąd zakleszczenia jest przykładem tego typu błędu. Instrukcja ROLLBACK wystawiona w wyzwalaczu również automatycznie generuje ten typ błędu.

Zachowanie blokujące

Instrukcja ROLLBACK TRANSACTION określająca savepoint_name zwalnia wszystkie blokady, które są uzyskiwane poza punktem zapisywania, z wyjątkiem eskalacji i konwersji. Te blokady nie są zwalniane i nie są konwertowane z powrotem na poprzedni tryb blokady.

Permissions

Wymaga członkostwa w publicznej roli .

Examples

W poniższym przykładzie pokazano efekt wycofywania nazwanej transakcji. Po utworzeniu tabeli następujące instrukcje rozpoczynają nazwaną transakcję, wstaw dwa wiersze, a następnie wycofają transakcję o nazwie w zmiennej @TransactionName. Inna instrukcja poza nazwaną transakcją wstawia dwa wiersze. Zapytanie zwraca wyniki poprzednich instrukcji.

USE tempdb;
GO

CREATE TABLE ValueTable ([value] INT);
GO

DECLARE @TransactionName VARCHAR(20) = 'Transaction1';

BEGIN TRANSACTION @TransactionName

INSERT INTO ValueTable
VALUES (1), (2);

ROLLBACK TRANSACTION @TransactionName;

INSERT INTO ValueTable
VALUES (3), (4);

SELECT [value]
FROM ValueTable;

DROP TABLE ValueTable;

Oto zestaw wyników.

value
-----
3
4