ROLLBACK TRANSACTION (Transact-SQL)
Führt für eine explizite oder implizite Transaktion ein Rollback zum Anfang der Transaktion oder auf einen Sicherungspunkt innerhalb der Transaktion aus. Mit ROLLBACK TRANSACTION können Sie alle Datenänderungen löschen, die seit dem letzten Start der Transaktion oder bis zu einem Sicherungspunkt vorgenommen wurden. Die Anweisung gibt auch Ressourcen frei, die von der Transaktion beansprucht werden.
Transact-SQL-Syntaxkonventionen
Syntax
ROLLBACK { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable
| savepoint_name | @savepoint_variable ]
[ ; ]
Argumente
transaction_name
Der bei BEGIN TRANSACTION der Transaktion zugewiesene Name. transaction_name muss den Regeln für Bezeichner entsprechen, wobei jedoch nur die ersten 32 Zeichen des Transaktionsnamens verwendet werden. Wenn Transaktionen geschachtelt werden, muss transaction_name der Name der äußersten BEGIN TRANSACTION-Anweisung sein.@ tran_name_variable
Der Name einer benutzerdefinierten Variablen, die einen gültigen Transaktionsnamen enthält. Die Variable muss mit dem Datentyp char, varchar, nchar oder nvarchar deklariert werden.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 betrifft.@ savepoint_variable
Dies ist der Name einer benutzerdefinierten Variablen, die einen gültigen Sicherungspunktnamen enthält. Die Variable muss mit einem der Datentypen char, varchar, nchar oder nvarchar deklariert werden.
Fehlerbehandlung
Eine ROLLBACK TRANSACTION-Anweisung erzeugt keine Meldung für den Benutzer. Falls Warnungen in gespeicherten Prozeduren oder Triggern benötigt werden, verwenden Sie die RAISERROR- oder die PRINT-Anweisung. Die RAISERROR-Anweisung wird beim Anzeigen von Fehlern bevorzugt.
Allgemeine Hinweise
Fehlt savepoint_name oder transaction_name in der ROLLBACK TRANSACTION-Anweisung, wird für die Transaktion ein Rollback bis zu ihrem Anfang ausgeführt. Wenn Transaktionen geschachtelt werden, führt diese Anweisung ein Rollback für alle inneren Transaktionen bis zur äußersten BEGIN TRANSACTION-Anweisung aus. In beiden Fällen setzt ROLLBACK TRANSACTION die @@TRANCOUNT-Systemfunktion auf 0 zurück. ROLLBACK TRANSACTION savepoint_name verringert @@TRANCOUNT nicht.
ROLLBACK TRANSACTION kann auf keinen savepoint_name-Wert in verteilten Transaktionen verweisen, die entweder explizit mit BEGIN DISTRIBUTED TRANSACTION gestartet oder aus einer lokalen Transaktion ausgeweitet wurden.
Ein Rollback kann nicht für eine Transaktion ausgeführt werden, nachdem eine COMMIT TRANSACTION-Anweisung ausgeführt wurde, es sei denn, COMMIT TRANSACTION ist einer geschachtelten Transaktion zugeordnet, die in der Transaktion enthalten ist, für die ein Rollback ausgeführt wird. In dieser Instanz wird auch ein Rollback für die geschachtelte Transaktion ausgeführt, auch wenn Sie einen COMMIT TRANSACTION hierfür ausgegeben haben.
Innerhalb einer Transaktion sind doppelte Sicherungspunktnamen zulässig; jedoch führt eine ROLLBACK TRANSACTION-Anweisung, die die doppelten Sicherungspunktnamen verwendet, das Rollback nur für die letzte SAVE TRANSACTION-Anweisung aus, die diesen Sicherungspunktnamen verwendet hat.
Interoperabilität
In gespeicherten Prozeduren führen ROLLBACK TRANSACTION-Anweisungen ohne savepoint_name oder transaction_name ein Rollback für alle Anweisungen bis zur äußersten BEGIN TRANSACTION-Anweisung aus. Eine ROLLBACK TRANSACTION-Anweisung in einer gespeicherten Prozedur, die bewirkt, dass @@TRANCOUNT bei Abschluss der gespeicherten Prozedur einen anderen Wert aufweist als den sich beim Aufrufen der gespeicherten Prozedur ergebenden @@TRANCOUNT-Wert, ruft eine Informationsmeldung hervor. Die Meldung beeinträchtigt nachfolgende Verarbeitungsvorgänge nicht.
Beim Ausgeben von ROLLBACK TRANSACTION in einem Trigger erfolgt Folgendes:
Für alle Datenänderungen, die bis zu diesem Zeitpunkt in der aktuellen Transaktion vorgenommen worden sind, wird ein Rollback ausgeführt, einschließlich aller Änderungen, die vom Trigger vorgenommen wurden.
Der Trigger setzt die Ausführung aller verbleibenden Anweisungen nach der ROLLBACK-Anweisung fort. 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, die auf die Anweisung folgen, die den Trigger ausgelöst hat, werden nicht ausgeführt.
@@TRANCOUNT wird um Eins inkrementiert, wenn ein Trigger ausgelöst wird, auch wenn der Autocommitmodus aktiviert ist. (Das System behandelt einen Trigger als implizite, geschachtelte Transaktion.)
ROLLBACK TRANSACTION-Anweisungen in einer gespeicherten Prozedur wirken sich nicht auf nachfolgende Anweisungen in dem Batch aus, der die Prozedur aufgerufen hat; 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 von ROLLBACK auf Cursor wird durch diese drei Regeln definiert:
Wenn CURSOR_CLOSE_ON_COMMIT auf ON festgelegt ist, schließt ROLLBACK alle offenen Cursor, hebt die Zuordnung aber nicht auf.
Wenn für CURSOR_CLOSE_ON_COMMIT OFF festgelegt ist, hat ROLLBACK keine Auswirkungen auf geöffnete synchrone STATIC- oder INSENSITIVE-Cursor oder asynchrone STATIC-Cursor, die vollständig aufgefü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. Die Zuordnung aller Cursor wird unabhängig von ihrem Typ oder der Einstellung von CURSOR_CLOSE_ON_COMMIT aufgehoben. Dazu gehören auch die Cursor, die in gespeicherten Prozeduren deklariert sind, die von dem Fehlerbatch aufgerufen wurden. In einem Batch vor dem Fehlerbatch deklarierte Cursor unterliegen den Regeln 1 und 2. Ein Beispiel für diese Art von Fehler ist ein Deadlockfehler. Eine in einem Trigger ausgegebene ROLLBACK-Anweisung generiert ebenfalls automatisch diese Art von Fehler.
Sperrverhalten
Mit einer ROLLBACK TRANSACTION-Anweisung, in der savepoint_name angegeben ist, werden alle Sperren aufgehoben, die außerhalb des Sicherungspunkts aktiviert werden, mit Ausnahme von Ausweitungen und Konvertierungen. Diese Sperren werden nicht aufgehoben, und sie werden nicht in ihren vorherigen Sperrmodus zurückkonvertiert.
Berechtigungen
Erfordert die Mitgliedschaft in der public-Rolle.
Beispiele
Im folgenden Beispiel werden die Auswirkungen des Rollbacks einer benannten Transaktion veranschaulicht.
USE tempdb;
GO
CREATE TABLE ValueTable ([value] int;)
GO
DECLARE @TransactionName varchar(20) = 'Transaction1';
--The following statements start a named transaction,
--insert two rows, and then roll back
--the transaction named in the variable @TransactionName.
--Another statement outside of the named transaction inserts two rows.
--The query returns the results of the previous statements.
BEGIN TRAN @TransactionName
INSERT INTO ValueTable VALUES(1), (2);
ROLLBACK TRAN @TransactionName;
INSERT INTO ValueTable VALUES(3),(4);
SELECT [value] FROM ValueTable;
DROP TABLE ValueTable;
--Results
--value
-------------
--3
--4
Siehe auch
Verweis
BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
BEGIN TRANSACTION (Transact-SQL)