Freigeben über


ROLLBACK TRANSACTION (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL verwaltete Instanz Azure Synapse Analytics Analytics Platform System (PDW) Warehouse in microsoft Fabric SQL-Datenbank in Microsoft Fabric SQL-Datenbank

Diese Anweisung setzt eine explizite oder implizite Transaktion an den Anfang der Transaktion oder auf einen Speicherpunkt innerhalb der Transaktion zurück. Sie können alle ROLLBACK TRANSACTION Datenänderungen löschen, die am Anfang der Transaktion oder an einem Speicherpunkt vorgenommen wurden. Die Anweisung gibt auch Ressourcen frei, die von der Transaktion beansprucht werden.

Ein Rollback einer Transaktion umfasst keine Änderungen, die an lokalen Variablen oder Tabellenvariablen vorgenommen wurden. Diese Änderungen werden von dieser Anweisung nicht gelöscht.

Transact-SQL-Syntaxkonventionen

Syntax

Syntax für SQL Server und Azure SQL-Datenbank

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

Syntax für Synapse Data Warehouse in Microsoft Fabric, Azure Synapse Analytics und Parallel Data Warehouse Database.

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

Argumente

transaction_name

Der Name, der der Transaktion zugewiesen ist, am BEGIN TRANSACTION. transaction_name muss den Regeln für Bezeichner entsprechen, wobei jedoch nur die ersten 32 Zeichen des Transaktionsnamens verwendet werden. Wenn Sie Transaktionen verschachteln, muss transaction_name der Name aus der äußersten BEGIN TRANSACTION Anweisung sein. transaction_name wird immer zwischen Groß- und Kleinschreibung unterschieden, auch wenn bei der Sql Server-Instanz die Groß-/Kleinschreibung nicht beachtet wird.

@tran_name_variable

Der Name einer benutzerdefinierten Variablen, die einen gültigen Transaktionsnamen enthält. Die Variable muss mit einem der folgenden Datentypen deklariert werden: char, varchar, nchar oder nvarchar.

savepoint_name

savepoint_name aus einer SAVE TRANSACTION Anweisung. savepoint_name muss den Regeln für Bezeichner entsprechen. Verwenden Sie savepoint_name, wenn ein bedingtes Rollback nur einen Teil der Transaktion betreffen soll.

@savepoint_variable

Der Name einer benutzerdefinierten Variablen, die einen gültigen Speicherpunktnamen enthält. Die Variable muss mit einem der folgenden Datentypen deklariert werden: char, varchar, nchar oder nvarchar.

Fehlerbehandlung

Eine ROLLBACK TRANSACTION Anweisung erzeugt dem Benutzer keine Nachrichten. Wenn Warnungen in gespeicherten Prozeduren oder Triggern erforderlich sind, verwenden Sie die RAISERROR anweisungen.PRINT RAISERROR ist die bevorzugte Anweisung für die Angabe von Fehlern.

Hinweise

ROLLBACK TRANSACTIONohne savepoint_name oder transaction_name zurück zum Anfang der Transaktion zurückgesetzt wird. Wenn Sie Transaktionen verschachteln, setzt diese Anweisung alle inneren Transaktionen auf die äußerste BEGIN TRANSACTION Anweisung zurück. In beiden Fällen ROLLBACK TRANSACTION wird die @@TRANCOUNT Systemfunktion auf 0 erhöht. ROLLBACK TRANSACTION <savepoint_name> wird nicht erhöht @@TRANCOUNT.

ROLLBACK TRANSACTION kann nicht auf eine savepoint_name in verteilten Transaktionen verweisen, die entweder explizit mit BEGIN DISTRIBUTED TRANSACTION einer lokalen Transaktion gestartet oder eskaliert wurden.

Eine Transaktion kann nicht zurückgesetzt werden, nachdem eine COMMIT TRANSACTION Anweisung ausgeführt wurde, außer wenn die COMMIT TRANSACTION Transaktion einer geschachtelten Transaktion zugeordnet ist, die in der Transaktion enthalten ist, die zurückgesetzt wird. In diesem Fall wird die geschachtelte Transaktion zurückgesetzt, auch wenn Sie eine COMMIT TRANSACTION für sie ausgestellt haben.

In einer Transaktion sind doppelte Speicherpunktnamen zulässig, aber bei verwendung ROLLBACK TRANSACTION des doppelten Speicherpunktnamens wird nur auf den neuesten SAVE TRANSACTION Speicherpunktnamen zurückgesetzt.

Interoperabilität

In gespeicherten Prozeduren ROLLBACK TRANSACTION werden Anweisungen ohne savepoint_name oder transaction_name alle Anweisungen in äußerster Randlage BEGIN TRANSACTIONrückgängig machen. Eine ROLLBACK TRANSACTION Anweisung in einer gespeicherten Prozedur, die einen anderen Wert aufweist, @@TRANCOUNT wenn die gespeicherte Prozedur abgeschlossen ist als der @@TRANCOUNT Wert, wenn die gespeicherte Prozedur aufgerufen wurde, erzeugt eine Informationsmeldung. Diese Nachricht wirkt sich nicht auf die nachfolgende Verarbeitung aus.

Wenn ein ROLLBACK TRANSACTION Auslöser ausgegeben wird:

  • Für alle Datenänderungen, die bis zu diesem Zeitpunkt in der aktuellen Transaktion vorgenommen wurden, wird ein Rollback ausgeführt, einschließlich aller Änderungen, die vom Trigger vorgenommen wurden.

  • Der Trigger führt alle verbleibenden Anweisungen nach der ROLLBACK Anweisung weiter aus. Wenn durch eine dieser Anweisungen Daten geändert werden, wird für die Änderungen kein Rollback ausgeführt. Es werden keine geschachtelten Trigger durch die Ausführung der verbleibenden Anweisungen ausgelöst.

  • Die Anweisungen im Batch nach der Anweisung, die den Trigger ausgelöst hat, werden nicht ausgeführt.

@@TRANCOUNT wird durch einen erhöht, wenn er einen Trigger eingibt, auch wenn der AutoCommit-Modus aktiviert ist. (Das System behandelt einen Trigger als implizite, geschachtelte Transaktion.)

ROLLBACK TRANSACTION Anweisungen in gespeicherten Prozeduren wirken sich nicht auf nachfolgende Anweisungen im Batch aus, die die Prozedur aufgerufen haben; nachfolgende Anweisungen im Batch werden ausgeführt. ROLLBACK TRANSACTION Anweisungen in Triggern beenden den Batch mit der Anweisung, die den Trigger ausgelöst hat; nachfolgende Anweisungen im Batch werden nicht ausgeführt.

Die Auswirkung eines ROLLBACK Cursors wird durch die folgenden drei Regeln definiert:

  • Mit CURSOR_CLOSE_ON_COMMIT "Set ON" ROLLBACK wird geschlossen, aber nicht alle geöffneten Cursor zugeordnet.

  • Bei CURSOR_CLOSE_ON_COMMIT Set OFFROLLBACK wirkt sich dies nicht auf geöffnete synchrone oder INSENSITIVE cursor STATIC oder asynchrone STATIC Cursor aus, die vollständig ausgefüllt wurden. Offene Cursor anderer Typen werden geschlossen, ihre Zuordnungen aber nicht aufgehoben.

  • Ein Fehler, der einen Batch beendet und ein internes Rollback generiert, hebt die Zuordnung alle Cursor auf, die in dem Batch deklariert wurden, der die Fehleranweisung enthält. Alle Cursor werden unabhängig vom Typ oder der Einstellung zugeordnet CURSOR_CLOSE_ON_COMMIT. Dazu gehören auch die Cursor, die in gespeicherten Prozeduren deklariert sind, die von dem Fehlerbatch aufgerufen wurden. Cursor, die in einem Batch deklariert sind, bevor der Fehlerbatch den ersten beiden Regeln unterliegt. Ein Beispiel für diese Art von Fehler ist ein Deadlockfehler. Eine ROLLBACK in einem Trigger ausgegebene Anweisung generiert auch automatisch diesen Fehlertyp.

Sperrverhalten

Eine ROLLBACK TRANSACTION Anweisung, die eine savepoint_name gibt alle Sperren frei, die über den Speicherpunkt hinaus erworben werden, mit Ausnahme von Eskalationen und Konvertierungen. Diese Sperren werden nicht freigegeben, und sie werden nicht wieder in den vorherigen Sperrmodus konvertiert.

Berechtigungen

Erfordert die Mitgliedschaft in der public -Rolle.

Beispiele

Im folgenden Beispiel werden die Auswirkungen des Rollbacks einer benannten Transaktion veranschaulicht. Nachdem Sie eine Tabelle erstellt haben, beginnen die folgenden Anweisungen eine benannte Transaktion, fügen zwei Zeilen ein, und führen Sie dann ein Rollback der transaktion namens in der Variablen @TransactionNameaus. Eine andere Anweisung außerhalb der benannten Transaktion fügt zwei Zeilen ein. Die Abfrage gibt die Ergebnisse der vorherigen Anweisungen zurück.

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;

Hier sehen Sie das Ergebnis.

value
-----
3
4