Freigeben über


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.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

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

Argumente

  • transaction_name
    Der Name, der der Transaktion bei BEGIN TRANSACTION zugewiesen wird. 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
    Dies ist 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 dem Datentyp char, varchar, nchar oder nvarchar deklariert werden.

Hinweise

ROLLBACK TRANSACTION löscht alle Datenänderungen, 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.

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.

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.

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.

Für eine Transaktion kann kein Rollback ausgeführt werden, nachdem eine COMMIT TRANSACTION-Anweisung ausgeführt wurde.

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.

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.

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.

Die Auswirkung von ROLLBACK auf Cursor wird durch diese drei Regeln definiert:

  1. Wenn CURSOR_CLOSE_ON_COMMIT auf ON festgelegt ist, schließt ROLLBACK alle offenen Cursor, hebt die Zuordnung aber nicht auf.

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

  3. 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 Deadlockfehler ist ein Beispiel für diese Art von Fehler. Eine in einem Trigger ausgegebene ROLLBACK-Anweisung generiert ebenfalls automatisch diese Art von Fehler.

Ein Codebeispiel zum Veranschaulichen von ROLLBACK TRANSACTION finden Sie unter Schachteln von Transaktionen.

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';

--These statements start a named transaction,
--insert a two records, and then roll back
--the transaction named in the variable 
--@TransactionName.
BEGIN TRAN @TransactionName
       INSERT INTO ValueTable VALUES(1)
       INSERT INTO ValueTable VALUES(2)
ROLLBACK TRAN @TransactionName

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

SELECT * FROM ValueTable

DROP TABLE ValueTable

--Results
--value
-------------
--3
--4