ROLLBACK TRANSACTION (Transact-SQL)ROLLBACK TRANSACTION (Transact-SQL)

Gilt für: JaSQL Server JaAzure SQL-Datenbank JaAzure Synapse Analytics (SQL DW) JaParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Führt für eine explizite oder implizite Transaktion ein Rollback zum Anfang der Transaktion oder auf einen Sicherungspunkt innerhalb der Transaktion aus.Rolls back an explicit or implicit transaction to the beginning of the transaction, or to a savepoint inside the transaction. 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.You can use ROLLBACK TRANSACTION to erase all data modifications made from the start of the transaction or to a savepoint. Die Anweisung gibt auch Ressourcen frei, die von der Transaktion beansprucht werden.It also frees resources held by the transaction.

Themenlinksymbol Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

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

ArgumenteArguments

transaction_nametransaction_name
Der bei BEGIN TRANSACTION der Transaktion zugewiesene Name.Is the name assigned to the transaction on BEGIN TRANSACTION. transaction_name muss den Regeln für Bezeichner entsprechen, wobei jedoch nur die ersten 32 Zeichen des Transaktionsnamens verwendet werden.transaction_name must conform to the rules for identifiers, but only the first 32 characters of the transaction name are used. Wenn Transaktionen geschachtelt werden, muss transaction_name der Name der äußersten BEGIN TRANSACTION-Anweisung sein.When nesting transactions, transaction_name must be the name from the outermost BEGIN TRANSACTION statement. transaction_name berücksichtigt immer die Groß-/Kleinschreibung, auch wenn die Instanz von SQL ServerSQL Server nicht zwischen Groß- und Kleinschreibung unterscheidet.transaction_name is always case-sensitive, even when the instance of SQL ServerSQL Server is not case-sensitive.

@ tran_name_variable@ tran_name_variable
Ist der Name einer benutzerdefinierten Variablen, die einen gültigen Transaktionsnamen enthält.Is the name of a user-defined variable containing a valid transaction name. Die Variable muss mit einem der folgenden Datentypen deklariert werden: char, varchar, nchar oder nvarchar.The variable must be declared with a char, varchar, nchar, or nvarchar data type.

savepoint_namesavepoint_name
savepoint_name aus einer SAVE TRANSACTION-Anweisung.Is savepoint_name from a SAVE TRANSACTION statement. savepoint_name muss den Regeln für Bezeichner entsprechen.savepoint_name must conform to the rules for identifiers. Verwenden Sie savepoint_name, wenn ein bedingtes Rollback nur einen Teil der Transaktion betreffen soll.Use savepoint_name when a conditional rollback should affect only part of the transaction.

@ savepoint_variable@ savepoint_variable
Dies ist der Name einer benutzerdefinierten Variablen, die einen gültigen Sicherungspunktnamen enthält.Is name of a user-defined variable containing a valid savepoint name. Die Variable muss mit einem der folgenden Datentypen deklariert werden: char, varchar, nchar oder nvarchar.The variable must be declared with a char, varchar, nchar, or nvarchar data type.

FehlerbehandlungError Handling

Eine ROLLBACK TRANSACTION-Anweisung erzeugt keine Meldung für den Benutzer.A ROLLBACK TRANSACTION statement does not produce any messages to the user. Falls Warnungen in gespeicherten Prozeduren oder Triggern benötigt werden, verwenden Sie die RAISERROR- oder die PRINT-Anweisung.If warnings are needed in stored procedures or triggers, use the RAISERROR or PRINT statements. Die RAISERROR-Anweisung wird beim Anzeigen von Fehlern bevorzugt.RAISERROR is the preferred statement for indicating errors.

Allgemeine HinweiseGeneral Remarks

Fehlt savepoint_name oder transaction_name in der ROLLBACK TRANSACTION-Anweisung, wird für die Transaktion ein Rollback bis zu ihrem Anfang ausgeführt.ROLLBACK TRANSACTION without a savepoint_name or transaction_name rolls back to the beginning of the transaction. Wenn Transaktionen geschachtelt werden, führt diese Anweisung ein Rollback für alle inneren Transaktionen bis zur äußersten BEGIN TRANSACTION-Anweisung aus.When nesting transactions, this same statement rolls back all inner transactions to the outermost BEGIN TRANSACTION statement. In beiden Fällen setzt ROLLBACK TRANSACTION die @@TRANCOUNT-Systemfunktion auf 0 (Null) zurück.In both cases, ROLLBACK TRANSACTION decrements the @@TRANCOUNT system function to 0. ROLLBACK TRANSACTION savepoint_name verringert @@TRANCOUNT nicht.ROLLBACK TRANSACTION savepoint_name does not decrement @@TRANCOUNT.

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.ROLLBACK TRANSACTION cannot reference a savepoint_name in distributed transactions started either explicitly with BEGIN DISTRIBUTED TRANSACTION or escalated from a local transaction.

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.A transaction cannot be rolled back after a COMMIT TRANSACTION statement is executed, except when the COMMIT TRANSACTION is associated with a nested transaction that is contained within the transaction being rolled back. In dieser Instanz wird ein Rollback für die geschachtelte Transaktion ausgeführt, auch wenn Sie eine COMMIT TRANSACTION-Anweisung hierfür ausgegeben haben.In this instance, the nested transaction is rolled back, even if you have issued a COMMIT TRANSACTION for it.

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.Within a transaction, duplicate savepoint names are allowed, but a ROLLBACK TRANSACTION using the duplicate savepoint name rolls back only to the most recent SAVE TRANSACTION using that savepoint name.

InteroperabilitätInteroperability

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.In stored procedures, ROLLBACK TRANSACTION statements without a savepoint_name or transaction_name roll back all statements to the outermost BEGIN TRANSACTION. 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.A ROLLBACK TRANSACTION statement in a stored procedure that causes @@TRANCOUNT to have a different value when the stored procedure completes than the @@TRANCOUNT value when the stored procedure was called produces an informational message. Die Meldung beeinträchtigt nachfolgende Verarbeitungsvorgänge nicht.This message does not affect subsequent processing.

Beim Ausgeben von ROLLBACK TRANSACTION in einem Trigger erfolgt Folgendes:If a ROLLBACK TRANSACTION is issued in a trigger:

  • 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.All data modifications made to that point in the current transaction are rolled back, including any made by the trigger.

  • Der Trigger setzt die Ausführung aller verbleibenden Anweisungen nach der ROLLBACK-Anweisung fort.The trigger continues executing any remaining statements after the ROLLBACK statement. Wenn durch eine dieser Anweisungen Daten geändert werden, wird für die Änderungen kein Rollback ausgeführt.If any of these statements modify data, the modifications are not rolled back. Es werden keine geschachtelten Trigger durch die Ausführung der verbleibenden Anweisungen ausgelöst.No nested triggers are fired by the execution of these remaining statements.

  • Die Anweisungen im Batch, die auf die Anweisung folgen, die den Trigger ausgelöst hat, werden nicht ausgeführt.The statements in the batch after the statement that fired the trigger are not executed.

@@TRANCOUNT wird um Eins inkrementiert, wenn ein Trigger ausgelöst wird, auch wenn der Autocommitmodus aktiviert ist.@@TRANCOUNT is incremented by one when entering a trigger, even when in autocommit mode. (Das System behandelt einen Trigger als implizite, geschachtelte Transaktion.)(The system treats a trigger as an implied nested transaction.)

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 statements in stored procedures do not affect subsequent statements in the batch that called the procedure; subsequent statements in the batch are executed. 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.ROLLBACK TRANSACTION statements in triggers terminate the batch containing the statement that fired the trigger; subsequent statements in the batch are not executed.

Die Auswirkung von ROLLBACK auf Cursor wird durch diese drei Regeln definiert:The effect of a ROLLBACK on cursors is defined by these three rules:

  1. Wenn CURSOR_CLOSE_ON_COMMIT auf ON festgelegt ist, schließt ROLLBACK alle offenen Cursor, hebt die Zuordnung aber nicht auf.With CURSOR_CLOSE_ON_COMMIT set ON, ROLLBACK closes, but does not deallocate all open cursors.

  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.With CURSOR_CLOSE_ON_COMMIT set OFF, ROLLBACK does not affect any open synchronous STATIC or INSENSITIVE cursors or asynchronous STATIC cursors that have been fully populated. Offene Cursor anderer Typen werden geschlossen, ihre Zuordnungen aber nicht aufgehoben.Open cursors of any other type are closed but not deallocated.

  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.An error that terminates a batch and generates an internal rollback deallocates all cursors that were declared in the batch containing the error statement. Die Zuordnung aller Cursor wird unabhängig von ihrem Typ oder der Einstellung von CURSOR_CLOSE_ON_COMMIT aufgehoben.All cursors are deallocated regardless of their type or the setting of CURSOR_CLOSE_ON_COMMIT. Dazu gehören auch die Cursor, die in gespeicherten Prozeduren deklariert sind, die von dem Fehlerbatch aufgerufen wurden.This includes cursors declared in stored procedures called by the error batch. In einem Batch vor dem Fehlerbatch deklarierte Cursor unterliegen den Regeln 1 und 2.Cursors declared in a batch before the error batch are subject to rules 1 and 2. Ein Beispiel für diese Art von Fehler ist ein Deadlockfehler.A deadlock error is an example of this type of error. Eine in einem Trigger ausgegebene ROLLBACK-Anweisung generiert ebenfalls automatisch diese Art von Fehler.A ROLLBACK statement issued in a trigger also automatically generates this type of error.

SperrverhaltenLocking Behavior

Mit einer ROLLBACK TRANSACTION-Anweisung, in der savepoint_name angegeben ist, werden alle Sperren freigegeben, die außerhalb des Sicherungspunkts aktiviert werden, mit Ausnahme von Ausweitungen und Konvertierungen.A ROLLBACK TRANSACTION statement specifying a savepoint_name releases any locks that are acquired beyond the savepoint, with the exception of escalations and conversions. Diese Sperren werden nicht aufgehoben, und sie werden nicht in ihren vorherigen Sperrmodus zurückkonvertiert.These locks are not released, and they are not converted back to their previous lock mode.

BerechtigungenPermissions

Erfordert die Mitgliedschaft in der public -Rolle.Requires membership in the public role.

BeispieleExamples

Im folgenden Beispiel werden die Auswirkungen des Rollbacks einer benannten Transaktion veranschaulicht.The following example shows the effect of rolling back a named transaction. Nach dem Erstellen einer Tabelle beginnen die folgenden Anweisungen eine benannte Transaktion, fügen zwei Zeilen ein und führen dann ein Rollback für die Transaktion aus, die durch die Variable @TransactionName benannt wird.After creating a table, the following statements start a named transaction, insert two rows, and then roll back the transaction named in the variable @TransactionName. Eine andere Anweisung außerhalb der benannten Transaktion fügt zwei Zeilen ein.Another statement outside of the named transaction inserts two rows. Die Abfrage gibt die Ergebnisse der vorherigen Anweisungen zurück.The query returns the results of the previous statements.

USE tempdb;  
GO  
CREATE TABLE ValueTable ([value] int);  
GO  
  
DECLARE @TransactionName varchar(20) = 'Transaction1';  
  
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;  

Im Folgenden finden Sie das Resultset.Here is the result set.

value  
-----   
3    
4  

Weitere InformationenSee Also

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL) BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
BEGIN TRANSACTION (Transact-SQL) BEGIN TRANSACTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL) COMMIT TRANSACTION (Transact-SQL)
COMMIT WORK (Transact-SQL) COMMIT WORK (Transact-SQL)
ROLLBACK WORK (Transact-SQL) ROLLBACK WORK (Transact-SQL)
SAVE TRANSACTION (Transact-SQL)SAVE TRANSACTION (Transact-SQL)