Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Verwaltete Azure SQL-Instanz
Azure Synapse Analytics
Analytics Platform System (PDW)
Lagerhaus in Microsoft Fabric
SQL-Datenbank in Microsoft Fabric
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, Azure SQL-Datenbank und Fabric SQL-Datenbank.
ROLLBACK { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable
| savepoint_name | @savepoint_variable ]
[ ; ]
Syntax für Fabric Data Warehouse, Azure Synapse Analytics und Parallel Data Warehouse-Datenbank.
ROLLBACK { TRAN | TRANSACTION }
[ ; ]
Arguments
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.
Remarks
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.
Interoperability
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
ROLLBACKAnweisung 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"ROLLBACKwird geschlossen, aber nicht alle geöffneten Cursor zugeordnet.Bei
CURSOR_CLOSE_ON_COMMITSetOFFROLLBACKwirkt sich dies nicht auf geöffnete synchrone oderSTATICcursorINSENSITIVEoder asynchroneSTATICCursor 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. EineROLLBACKin 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.
Permissions
Erfordert die Mitgliedschaft in der public -Rolle.
Examples
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