COMMIT TRANSACTION (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL verwaltete Instanz Azure Synapse Analytics Analytics Platform System (PDW) Warehouse in microsoft Fabric SQL-Datenbank in Microsoft Fabric SQL-Datenbank
Markiert das Ende einer erfolgreichen impliziten oder expliziten Transaktion. Wenn @@TRANCOUNT
1 ist, COMMIT TRANSACTION
werden alle Datenänderungen seit Beginn der Transaktion als dauerhafter Teil der Datenbank freigegeben, die Ressourcen der Transaktion freigegeben und auf 0 erhöht @@TRANCOUNT
. Wenn @@TRANCOUNT
größer als 1 ist, wird nur um 1 erhöht@@TRANCOUNT
, COMMIT TRANSACTION
und die Transaktion bleibt aktiv.
Transact-SQL-Syntaxkonventionen
Syntax
Syntax für SQL Server und Azure SQL-Datenbank
COMMIT [ { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable ] ]
[ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]
[ ; ]
Syntax für Synapse Data Warehouse in Microsoft Fabric, Azure Synapse Analytics und Parallel Data Warehouse Database.
COMMIT [ TRAN | TRANSACTION ]
[ ; ]
Argumente
transaction_name
Gilt für: SQL Server und Azure SQL-Datenbank
Wird vom SQL Server-Datenbank-Engine ignoriert. transaction_name gibt einen Transaktionsnamen an, der einem vorherigen BEGIN TRANSACTION
Zugeordnet ist. transaction_name muss den Regeln für Bezeichner entsprechen, darf jedoch 32 Zeichen nicht überschreiten. transaction_name gibt an, dass Programmierer, denen die COMMIT TRANSACTION
Schachtelung zugeordnet BEGIN TRANSACTION
ist, zugeordnet sind.
@tran_name_variable
Gilt für: SQL Server und Azure SQL-Datenbank
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. Wenn mehr als 32 Zeichen an die Variable übergeben werden, werden nur 32 Zeichen verwendet. Die verbleibenden Zeichen werden abgeschnitten.
WITH DELAYED_DURABILITY = { OFF | ON }
Gilt für: SQL Server und Azure SQL-Datenbank
Eine Option, die erfordert, dass für diese Transaktion ein Commit mit verzögerter Dauerhaftigkeit ausgeführt werden sollte. Die Anforderung wird ignoriert, wenn die Datenbank mit DELAYED_DURABILITY = DISABLED
oder DELAYED_DURABILITY = FORCED
. Weitere Informationen finden Sie im Thema Steuern der Transaktionsdauerhaftigkeit.
Hinweise
Es liegt in der Verantwortung des Transact-SQL-Programmierers, nur an einem Punkt ausstellen COMMIT TRANSACTION
zu können, an dem alle Daten, auf die von der Transaktion verwiesen wird, logisch korrekt sind.
Wenn es sich bei der zugesicherten Transaktion um eine verteilte Transact-SQL-Transaktion handelt, löst MS DTC aus, COMMIT TRANSACTION
um ein zweistufiges Commitprotokoll zu verwenden, um alle server, die an der Transaktion beteiligt sind, zu übernehmen. Erstreckt sich eine lokale Transaktion über mehrere Datenbanken in derselben Instanz des Datenbank-Engines, verwendet die Instanz einen internen Zweiphasencommit, um für alle an der Transaktion beteiligten Datenbanken einen Commit auszuführen.
Bei der Verwendung in geschachtelten Transaktionen werden durch Commits der inneren Transaktionen keine Ressourcen freigegeben oder Änderungen dauerhaft gespeichert. Die Datenänderungen werden nur dann dauerhaft und Ressourcen nur dann freigegeben, wenn für die äußere Transaktion ein Commit ausgeführt wird. Jede COMMIT TRANSACTION
ausgegeben wird, wenn @@TRANCOUNT
größer als eins ist, erhöht @@TRANCOUNT
sich einfach um 1. Wenn @@TRANCOUNT
schließlich auf 0 erhöht wird, wird die gesamte äußere Transaktion zugesichert. Da transaction_name vom Datenbank-Engine ignoriert wird, wird ein COMMIT TRANSACTION
Verweis auf den Namen einer äußeren Transaktion ausgestellt, wenn es ausstehende innere Transaktionen nur um 1 gibt@@TRANCOUNT
.
Das Ausgeben einer COMMIT TRANSACTION
Wenn @@TRANCOUNT
null ist, führt zu einem Fehler; es gibt keine entsprechende BEGIN TRANSACTION
.
Sie können ein Rollback einer Transaktion nach der Ausstellung einer COMMIT TRANSACTION
Anweisung nicht rückgängig machen, da die Datenänderungen an einem dauerhaften Teil der Datenbank vorgenommen wurden.
Die Transaktionsanzahl in einer Anweisung wird vom Datenbank-Engine nur erhöht, wenn die Transaktionsanzahl beim Start der Anweisung 0 (null) lautet.
Berechtigungen
Erfordert die Mitgliedschaft in der public -Rolle.
Beispiele
Die Transact-SQL-Codebeispiele in diesem Artikel verwenden die AdventureWorks2022
- oder AdventureWorksDW2022
-Beispieldatenbank, die Sie von der Homepage Microsoft SQL Server Samples and Community Projects herunterladen können.
A. Commit für eine Transaktion
Gilt für: SQL Server, Azure SQL-Datenbank, Azure Synapse Analytics und Analytics Platform System (PDW)
Im folgenden Beispiel wird ein Stellenbewerber gelöscht.
BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION;
B. Commit einer geschachtelten Transaktion
Gilt für: SQL Server und Azure SQL-Datenbank
Im folgenden Beispiel werden eine Tabelle erstellt und drei Ebenen von geschachtelten Transaktionen generiert, und anschließend wird für die geschachtelte Transaktion ein Commit ausgeführt. Obwohl jede COMMIT TRANSACTION
-Anweisung einen transaction_name-Parameter aufweist, gibt es keine Beziehung zwischen der COMMIT TRANSACTION
-Anweisung und der BEGIN TRANSACTION
-Anweisung. Die transaction_name-Parameter helfen dem Programmierer, die richtige Anzahl von Commits zu codieren, damit @@TRANCOUNT
auf 0 (null) herabgesetzt und dadurch für die äußere Transaktion ein Commit ausgeführt wird.
IF OBJECT_ID(N'TestTran', N'U') IS NOT NULL
DROP TABLE TestTran;
GO
CREATE TABLE TestTran (
Cola INT PRIMARY KEY,
Colb CHAR(3)
);
GO
-- This statement sets @@TRANCOUNT to 1.
BEGIN TRANSACTION OuterTran;
PRINT N'Transaction count after BEGIN OuterTran = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
INSERT INTO TestTran
VALUES (1, 'aaa');
-- This statement sets @@TRANCOUNT to 2.
BEGIN TRANSACTION Inner1;
PRINT N'Transaction count after BEGIN Inner1 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
INSERT INTO TestTran
VALUES (2, 'bbb');
-- This statement sets @@TRANCOUNT to 3.
BEGIN TRANSACTION Inner2;
PRINT N'Transaction count after BEGIN Inner2 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
INSERT INTO TestTran
VALUES (3, 'ccc');
-- This statement decrements @@TRANCOUNT to 2.
-- Nothing is committed.
COMMIT TRANSACTION Inner2;
PRINT N'Transaction count after COMMIT Inner2 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
-- This statement decrements @@TRANCOUNT to 1.
-- Nothing is committed.
COMMIT TRANSACTION Inner1;
PRINT N'Transaction count after COMMIT Inner1 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
-- This statement decrements @@TRANCOUNT to 0 and
-- commits outer transaction OuterTran.
COMMIT TRANSACTION OuterTran;
PRINT N'Transaction count after COMMIT OuterTran = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));