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 TRANSACTION
ohne 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 TRANSACTION
rü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
"SetON
"ROLLBACK
wird geschlossen, aber nicht alle geöffneten Cursor zugeordnet.Bei
CURSOR_CLOSE_ON_COMMIT
SetOFF
ROLLBACK
wirkt sich dies nicht auf geöffnete synchrone oderINSENSITIVE
cursorSTATIC
oder asynchroneSTATIC
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. EineROLLBACK
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 @TransactionName
aus. 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