Freigeben über


COMMIT TRANSACTION (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL verwaltete Instanz Azure Synapse Analytics Platform System (PDW) Warehouse in Microsoft Fabric

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 TRANSACTIONZugeordnet 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));