Freigeben über


ÜBERSCHREITEN 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

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öhtCOMMIT TRANSACTION, @@TRANCOUNT und die Transaktion bleibt aktiv.

Transact-SQL-Syntaxkonventionen

Syntax

Syntax für SQL Server, Azure SQL Database, SQL-Datenbank in Microsoft Fabric.

COMMIT [ { TRAN | TRANSACTION }
    [ transaction_name | @tran_name_variable ] ]
    [ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]
[ ; ]

Syntax für Fabric Data Warehouse, Azure Synapse Analytics und Parallel Data Warehouse-Datenbank.

COMMIT [ TRAN | TRANSACTION ]
[ ; ]

Arguments

transaction_name

Gilt für: SQL Server, Azure SQL Database, SQL-Datenbank in Microsoft Fabric.

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 BEGIN TRANSACTION Schachtelung zugeordnet COMMIT TRANSACTION ist, zugeordnet sind.

@tran_name_variable

Gilt für: SQL Server, Azure SQL Database, 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. Wenn mehr als 32 Zeichen an die Variable übergeben werden, werden nur 32 Zeichen verwendet. Die verbleibenden Zeichen werden abgeschnitten.

MIT DELAYED_DURABILITY = { OFF | ON }

Gilt für: SQL Server, Azure SQL Database, SQL-Datenbank in Microsoft Fabric.

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.

Remarks

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.

Permissions

Erfordert die Mitgliedschaft in der public -Rolle.

Examples

Die Codebeispiele in diesem Artikel verwenden die AdventureWorks2025- oder AdventureWorksDW2025 Beispieldatenbank, die Sie von der Microsoft SQL Server Samples and Community Projects Homepage 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, Azure SQL Database, SQL-Datenbank in Microsoft Fabric.

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