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 verwenden die Verwendung ROLLBACK TRANSACTION , um alle Datenänderungen zu löschen, die am Anfang der Transaktion oder an einem Speicherpunkt vorgenommen wurden.
ROLLBACK TRANSACTION gibt auch die ressourcen frei, die von der Transaktion gehalten werden.
Änderungen an lokalen Variablen oder Tabellenvariablen werden von dieser Anweisung nicht gelöscht.
Transact-SQL-Syntaxkonventionen
Syntax
Syntax für SQL Server, Azure SQL-Datenbank, Azure SQL Managed Instance, SQL-Datenbank in Microsoft Fabric.
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
Gilt für: SQL Server 2008 (10.0.x) und höhere Versionen, Azure SQL-Datenbank, Azure SQL Managed Instance, SQL-Datenbank in Microsoft Fabric.
Der Name, der der Transaktion zugewiesen ist.BEGIN TRANSACTION
transaction_name muss den Regeln für Bezeichner entsprechen, wobei jedoch nur die ersten 32 Zeichen des Transaktionsnamens verwendet werden. Wenn innere Transaktionen vorhanden sind, muss transaction_name der Name aus der äußersten BEGIN TRANSACTION Anweisung sein.
bei transaction_name wird immer die Groß-/Kleinschreibung beachtet, auch wenn bei der Datenbankmodulinstanz keine Groß-/Kleinschreibung beachtet wird.
@tran_name_variable
Gilt für: SQL Server 2008 (10.0.x) und höhere Versionen, Azure SQL-Datenbank, Azure SQL Managed Instance, SQL-Datenbank in Microsoft Fabric.
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 sich ein Rollback nur auf den Teil der Transaktion nach dem Speicherpunkt auswirken 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
Remarks
ROLLBACK TRANSACTIONohne savepoint_name oder transaction_name zurück zum Anfang der Transaktion zurückgesetzt wird. Wenn innere Transaktionen vorhanden sind, werden alle inneren Transaktionen mit dieser BEGIN TRANSACTION Anweisung zurückgesetzt. 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 höhergestuft wurden.
Eine Transaktion kann nicht zurückgesetzt werden, nachdem eine COMMIT TRANSACTION Anweisung ausgeführt wurde, es sei denn, die COMMIT TRANSACTION Transaktion ist einer inneren Transaktion zugeordnet, die in der Transaktion enthalten ist, die zurückgesetzt wird. In diesem Fall wird die innere Transaktion zurückgesetzt, auch wenn Sie eine COMMIT TRANSACTION dafür 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.
Hinweis
Das Datenbankmodul unterstützt keine unabhängig verwaltbaren geschachtelten Transaktionen. Ein Commit einer inneren @@TRANCOUNT Transaktion wird erhöht, hat jedoch keine anderen Auswirkungen. Ein Rollback einer inneren Transaktion führt immer einen Rollback der äußeren Transaktion durch, es sei denn, ein Speicherpunkt ist vorhanden und wird in der ROLLBACK Anweisung angegeben.
Interoperability
In gespeicherten Prozeduren setzt eine ROLLBACK TRANSACTION Anweisung ohne savepoint_name oder transaction_name alle Anweisungen auf äußerste Rand BEGIN TRANSACTIONzurück. Eine ROLLBACK TRANSACTION Anweisung in einer gespeicherten Prozedur, die @@TRANCOUNT beim Abschluss der Prozedur einen anderen Wert hat als der Wert bei Prozedurstart, 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 implizierte innere Transaktion.
Eine ROLLBACK TRANSACTION Anweisung in einer gespeicherten Prozedur wirkt sich nicht auf nachfolgende Anweisungen im Batch aus, der die Prozedur aufgerufen hat. Nachfolgende Anweisungen im Batch werden ausgeführt.
Eine ROLLBACK TRANSACTION Anweisung in einem Trigger beendet den Batch mit der Anweisung, die den Trigger ausgelöst hat. Nachfolgende Anweisungen im Batch werden nicht ausgeführt.
Der Effekt eines ROLLBACK Cursors wird durch die folgenden Regeln definiert:
Bei
CURSOR_CLOSE_ON_COMMITFestlegung aufON" wird geschlossen,ROLLBACKaber nicht alle geöffneten Cursor zugeordnet.Bei
CURSOR_CLOSE_ON_COMMITFestlegung aufOFF,ROLLBACKhat keine Auswirkung auf geöffnete synchroneSTATICoderINSENSITIVEasynchrone Cursor oder asynchroneSTATICCursor, die vollständig ausgefüllt sind. Offene Cursor anderer Typen werden geschlossen, ihre Zuordnungen aber nicht aufgehoben.Ein Fehler, der einen Batch beendet und die Transaktion zurückgesetzt, sodass alle Cursor, die im Batch deklariert wurden, mit der Anweisung, die den Fehler erzeugt, zurückgesetzt werden. Alle Cursor werden unabhängig vom Typ oder der Einstellung zugeordnet
CURSOR_CLOSE_ON_COMMIT. Dies schließt Cursor ein, die in gespeicherten Prozeduren deklariert werden, die vom Batch aufgerufen werden, der den Fehler erzeugt. Cursor, die in einem Batch deklariert wurden, bevor der Batch den Fehler erzeugt, unterliegen den vorherigen beiden Regeln.Ein Deadlock ist ein Beispiel für diesen Fehlertyp. Eine
ROLLBACKin einem Trigger ausgegebene Anweisung führt auch zu diesem Verhalten.
Sperrverhalten
Eine ROLLBACK TRANSACTION Anweisung, die eine savepoint_name gibt alle Sperren frei, die über den Speicherpunkt hinaus abgerufen werden, mit Ausnahme von eskalierten und konvertierten Sperren. Diese Sperren werden nicht freigegeben, und sie werden nicht wieder in den vorherigen Sperrmodus konvertiert.
Permissions
Erfordert die Mitgliedschaft in der Rolle public.
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;
CREATE TABLE ValueTable
(
value INT
);
DECLARE @TransactionName AS 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