Sdílet prostřednictvím


COMMIT TRANSACTION (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsPdW (Analytics Platform System)Sklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Označí konec úspěšné implicitní nebo explicitní transakce.

Pokud @@TRANCOUNT je 1, COMMIT TRANSACTION provede všechny úpravy dat od začátku transakce trvalou část databáze, uvolní transakční prostředky a dekrementuje @@TRANCOUNT na 0.

Pokud @@TRANCOUNT je větší než 1, COMMIT TRANSACTION dekrementuje @@TRANCOUNT o 1 a transakce zůstane aktivní.

Transact-SQL konvence syntaxe

Syntax

Syntaxe pro SQL Server, Azure SQL Database, Spravovanou instanci Azure SQL a databázi SQL v Microsoft Fabric.

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

Syntaxe datového skladu infrastruktury, Azure Synapse Analytics a paralelní databáze datového skladu

COMMIT [ TRAN | TRANSACTION ]
[ ; ]

Arguments

transaction_name

Platí pro: SQL Server 2008 (10.0.x) a novější verze, Azure SQL Database, Azure SQL Managed Instance, DATABÁZE SQL v Microsoft Fabric.

Ignorováno databázovým strojem při zadání pomocí COMMIT. transaction_name určuje název transakce přiřazený předchozím BEGIN TRANSACTION. transaction_name musí odpovídat pravidlům identifikátorů, ale nesmí překročit 32 znaků. transaction_name lze použít jako techniku dokumentace kódu k označení, ke kterému z vnitřních BEGIN TRANSACTIONCOMMIT TRANSACTION příkazů je příkaz přidružený.

@tran_name_variable

Platí pro: SQL Server 2008 (10.0.x) a novější verze, Azure SQL Database, Azure SQL Managed Instance, DATABÁZE SQL v Microsoft Fabric.

Název uživatelem definované proměnné obsahující platný název transakce. Proměnná musí být deklarována pomocí datového typu char, varchar, nchar nebo nvarchar . Pokud proměnné předáte více než 32 znaků, použijí se pouze prvních 32 znaků. Zbývající znaky jsou zkráceny.

S DELAYED_DURABILITY = { VYPNUTO | ZAPNUTO }

Platí pro: SQL Server 2008 (10.0.x) a novější verze, Azure SQL Database, Azure SQL Managed Instance, DATABÁZE SQL v Microsoft Fabric.

Možnost, která požaduje, aby byla tato transakce potvrzena s zpožděnou stálostí. Požadavek se ignoruje, pokud je pro databázi zakázaná zpožděná stálost. Transakce je potvrzena se zpožděnou stálostí bez ohledu na tuto možnost, pokud je pro databázi vynucena zpožděná stálost.

Další informace naleznete v tématu Trvanlivost transakce.

Remarks

Je odpovědností aplikace, aby v okamžiku, COMMIT TRANSACTION kdy všechna data odkazovaná transakcí dosáhla zamýšleného stavu konzistence.

Pokud transakce potvrzena byla Transact-SQL distribuovaná transakce, COMMIT TRANSACTION aktivuje MS DTC použít dvoufázový potvrzovací protokol k potvrzení transakce na všech serverech zapojených do transakce. Pokud místní transakce zahrnuje dvě nebo více databází ve stejné instanci databázového stroje, instance používá interní dvoufázové potvrzení k potvrzení transakce ve všech databázích zapojených do transakce.

Pokud se používá pro vnitřní transakce, potvrzení neobsahuje volné prostředky ani neprovádí trvalé úpravy dat. Změny dat jsou provedeny trvalé a prostředky jsou uvolněny pouze při potvrzení vnější transakce. Každý COMMIT TRANSACTION vystavený, pokud @@TRANCOUNT je větší než 1 dekrementuje @@TRANCOUNT o 1, ale nemá žádné jiné účinky. Když @@TRANCOUNT se nakonec dekrementuje na 0, je potvrzena celá vnější transakce. Vzhledem k tomu, že databázový stroj transaction_name je COMMIT TRANSACTION ignorován, vydává COMMIT TRANSACTION odkazující na název vnější transakce, pokud existují nevyřízené vnitřní transakce pouze o @@TRANCOUNT 1.

Vydání COMMIT TRANSACTION hodnoty když @@TRANCOUNT je nula výsledkem chyby, protože neexistuje žádná odpovídající BEGIN TRANSACTIONhodnota .

Po vydání příkazu nelze vrátit transakce COMMIT TRANSACTION zpět, protože úpravy dat jsou již trvalou součástí databáze.

Poznámka:

Databázový stroj nepodporuje nezávisle spravovatelné vnořené transakce. Potvrzení vnitřní transakce dekrementuje @@TRANCOUNT , ale nemá žádné jiné účinky. Vrácení zpět vnitřní transakce vždy vrátí zpět vnější transakce, pokud neexistuje savepoint a je zadán v ROLLBACK příkazu.

Permissions

Vyžaduje členství v public roli.

Examples

Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .

A. Potvrzení transakce

Platí pro: SQL Server, Azure SQL Database, Azure SQL Managed Instance, sql database in Microsoft Fabric, Azure Synapse Analytics, Analytics Platform System (PDW)

Následující příklad odstraní kandidáta na pracovní pozici.

BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION;

B. Potvrzení vnější transakce a vnitřní transakce

Platí pro: SQL Server, Azure SQL Database, Azure SQL Managed Instance, databáze SQL v Microsoft Fabric.

Následující příklad vytvoří tabulku, spustí vnější a dvě vnitřní transakce a pak potvrdí každou transakci. Parametry transaction_name použité v tomto příkladu pomáhají vývojáři zajistit, aby byl správný počet potvrzení zakódován tak, aby se dekrementoval @@TRANCOUNT na 0 a k potvrzení vnější transakce.

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