Udostępnij przez


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. ROLLBACK TRANSACTION Służy do wymazywania wszystkich modyfikacji danych dokonanych od początku transakcji lub z punktu zapisywania. ROLLBACK TRANSACTION zwalnia również zasoby przechowywane przez transakcję.

Zmiany wprowadzone w zmiennych lokalnych lub zmiennych tabeli nie są usuwane przez tę instrukcję.

Transact-SQL konwencje składni

Syntax

Składnia dla programu SQL Server, usługi Azure SQL Database, usługi Azure SQL Managed Instance, bazy danych SQL w usłudze Microsoft 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

Dotyczy: SQL Server 2008 (10.0.x) i nowsze wersje, Azure SQL Database, Azure SQL Managed Instance, SQL Database w usłudze Microsoft Fabric.

Nazwa przypisana do transakcji za pomocą BEGIN TRANSACTIONpolecenia . transaction_name muszą być zgodne z regułami identyfikatorów, ale są używane tylko 32 pierwsze znaki nazwy transakcji. Jeśli istnieją transakcje wewnętrzne, transaction_name musi być nazwą z najbardziej zewnętrznej BEGIN TRANSACTION instrukcji. transaction_name zawsze uwzględnia wielkość liter, nawet jeśli wystąpienie aparatu bazy danych nie uwzględnia wielkości liter.

@tran_name_variable

Dotyczy: SQL Server 2008 (10.0.x) i nowsze wersje, Azure SQL Database, Azure SQL Managed Instance, SQL Database w usłudze Microsoft Fabric.

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 powinno mieć wpływ tylko na część transakcji po punkcie zapisywania.

@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 .

Remarks

ROLLBACK TRANSACTION bez savepoint_name lub transaction_name wraca do początku transakcji. Jeśli istnieją transakcje wewnętrzne, ta sama instrukcja przywraca wszystkie transakcje wewnętrzne 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 BEGIN DISTRIBUTED TRANSACTION lub promowanych z transakcji lokalnej.

Nie można wycofać transakcji po wykonaniu COMMIT TRANSACTION instrukcji, z wyjątkiem sytuacji, gdy COMMIT TRANSACTION jest skojarzona z transakcją wewnętrzną zawartą w transakcji, która jest wycofana. W tym przypadku transakcja wewnętrzna jest cofana, nawet jeśli została ona wystawiona COMMIT TRANSACTION .

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.

Uwaga / Notatka

Aparat bazy danych nie obsługuje niezależnie zarządzanych zagnieżdżonych transakcji. Zatwierdzenie wewnętrznego dekrementowania @@TRANCOUNT transakcji, ale nie ma innych efektów. Wycofanie transakcji wewnętrznej zawsze cofa zewnętrzną transakcję, chyba że istnieje punkt zapisywania i jest określony w instrukcji ROLLBACK .

Interoperability

W procedurach ROLLBACK TRANSACTION składowanych instrukcja bez savepoint_name lub transaction_name przywraca wszystkie instrukcje do najbardziej zewnętrznego BEGIN TRANSACTION. Instrukcja ROLLBACK TRANSACTION w procedurze składowanej, która powoduje @@TRANCOUNT , że po zakończeniu procedury ma inną wartość niż wartość na początku procedury 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ę wewnętrzną.

Instrukcja ROLLBACK TRANSACTION w procedurze składowanej nie ma wpływu na kolejne instrukcje w partii, która nazwała procedurę. Kolejne instrukcje w partii są wykonywane.

Instrukcja ROLLBACK TRANSACTION w wyzwalaczu kończy partię zawierającą instrukcję, która wyzwoliła wyzwalacz. Kolejne instrukcje w partii nie są wykonywane.

Efekt ROLLBACK kursorów jest definiowany przez następujące reguły:

  • W CURSOR_CLOSE_ON_COMMIT ustawieniu na ON, ROLLBACK zamyka, ale nie cofa przydziału wszystkich otwartych kursorów.

  • W CURSOR_CLOSE_ON_COMMIT przypadku ustawienia na OFFwartość nie ROLLBACK ma wpływu na otwarte synchroniczne STATIC lub INSENSITIVE kursory ani kursory asynchroniczne STATIC , które są 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 cofa cofnięcie przydziału transakcji powoduje cofnięcie przydziału wszystkich kursorów zadeklarowanych w partii zawierającej instrukcję generującą błąd. 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ę generującą błąd. Kursory zadeklarowane w partii przed utworzeniem partii błędu podlegają poprzednim dwóm regułom.

    Zakleszczenie jest przykładem tego typu błędu. Instrukcja ROLLBACK wystawiona w wyzwalaczu powoduje również takie zachowanie.

Zachowanie blokujące

Instrukcja ROLLBACK TRANSACTION określająca savepoint_name zwalnia wszystkie blokady uzyskane poza punktem zapisywania, z wyjątkiem eskalowanych i przekonwertowanych blokad. Te blokady nie są zwalniane i nie są konwertowane z powrotem na poprzedni tryb blokady.

Permissions

Wymaga członkostwa w public 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;
CREATE TABLE ValueTable
(
    value INT
);

DECLARE @TransactionName AS 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