Freigeben über


ROLLBACK-TRANSAKTION (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzAzure Synapse AnalyticsAnalytics Platform System (PDW)Lagerhaus in Microsoft FabricSQL-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 ROLLBACK Anweisung 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_COMMIT Festlegung auf ON" wird geschlossen, ROLLBACK aber nicht alle geöffneten Cursor zugeordnet.

  • Bei CURSOR_CLOSE_ON_COMMIT Festlegung auf OFF, ROLLBACK hat keine Auswirkung auf geöffnete synchrone STATIC oder INSENSITIVE asynchrone Cursor oder asynchrone STATIC Cursor, 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 ROLLBACK in 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