Megosztás a következőn keresztül:


VÉGLEGESÍTÉSI TRANZAKCIÓ (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsElemzési platformrendszer (PDW)Raktár a Microsoft FabricbenSQL-adatbázis a Microsoft Fabricben

Egy sikeres implicit vagy explicit tranzakció végét jelöli meg.

Ha @@TRANCOUNT 1, COMMIT TRANSACTION a tranzakció kezdete óta végrehajtott összes adatmódosítás az adatbázis állandó részét képezi, felszabadítja a tranzakció erőforrásait, és 0-ra @@TRANCOUNT csökken.

Ha @@TRANCOUNT 1-nél nagyobb, COMMIT TRANSACTION a decrements @@TRANCOUNT by 1 és a tranzakció aktív marad.

Transact-SQL szintaxis konvenciók

Syntax

Szintaxis az SQL Serverhez, az Azure SQL Database-hez, a felügyelt Azure SQL-példányhoz és a Microsoft Fabric SQL-adatbázishoz.

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

A Fabric Data Warehouse, az Azure Synapse Analytics és a párhuzamos adattárház-adatbázis szintaxisa.

COMMIT [ TRAN | TRANSACTION ]
[ ; ]

Arguments

transaction_name

A következőkre vonatkozik: SQL Server 2008 (10.0.x) és újabb verziók, Azure SQL Database, Felügyelt Azure SQL-példány, SQL Database a Microsoft Fabricben.

Az adatbázismotor figyelmen kívül hagyja, ha meg van adva a következővel COMMIT: . transaction_name egy előző BEGIN TRANSACTIONáltal hozzárendelt tranzakciónevet ad meg. transaction_name meg kell felelnie az azonosítókra vonatkozó szabályoknak, de nem haladhatja meg a 32 karaktert. transaction_name használható kóddokumentáció-technikaként annak jelzésére, hogy az utasítás mely belső BEGIN TRANSACTION utasításokkal COMMIT TRANSACTION van társítva.

@tran_name_variable

A következőkre vonatkozik: SQL Server 2008 (10.0.x) és újabb verziók, Azure SQL Database, Felügyelt Azure SQL-példány, SQL Database a Microsoft Fabricben.

Egy felhasználó által definiált változó neve, amely érvényes tranzakciónevet tartalmaz. A változót karakter, varchar, nchar vagy nvarchar adattípussal kell deklarálni. Ha 32 karakternél több karaktert ad át a változónak, csak az első 32 karaktert használja a rendszer. A többi karakter csonkolt.

WITH DELAYED_DURABILITY = { OFF | ON }

A következőkre vonatkozik: SQL Server 2008 (10.0.x) és újabb verziók, Azure SQL Database, Felügyelt Azure SQL-példány, SQL Database a Microsoft Fabricben.

Az a lehetőség, amely azt kéri, hogy a tranzakciót késleltetett tartóssággal véglegesíteni lehessen. A rendszer figyelmen kívül hagyja a kérést, ha az adatbázis késleltetett tartóssága le van tiltva. A tranzakciót késleltetett tartóssággal véglegesítik, függetlenül attól, hogy ez a lehetőség van-e, ha az adatbázishoz késleltetett tartósságra van szükség.

További információért lásd: Tranzakció tartósságának ellenőrzése.

Remarks

Az alkalmazás feladata, hogy olyan időpontban adjon ki COMMIT TRANSACTION , amikor a tranzakció által hivatkozott összes adat eléri a konzisztencia kívánt állapotát.

Ha a lekötött tranzakció egy Transact-SQL elosztott tranzakció volt, COMMIT TRANSACTION az MS DTC kétfázisú véglegesítési protokoll használatával véglegesíti a tranzakciót a tranzakcióban részt vevő összes kiszolgálón. Ha egy helyi tranzakció két vagy több adatbázisra terjed ki az adatbázismotor ugyanazon példányán, a példány egy belső kétfázisú véglegesítéssel véglegesíti a tranzakciót a tranzakcióban részt vevő összes adatbázisban.

Belső tranzakciókhoz használva a véglegesítés nem szabadít fel erőforrásokat, és nem teszi véglegessé az adatmódosításokat. Az adatmódosítások véglegesítésre kerülnek, és az erőforrások csak a külső tranzakció véglegesítésekor szabadulnak fel. Minden COMMIT TRANSACTION kibocsátott, ha @@TRANCOUNT nagyobb, mint 1 decrements @@TRANCOUNT by 1, de nincs más hatása. Amikor @@TRANCOUNT végül 0-ra csökken, a teljes külső tranzakció véglegesítve lesz. Mivel a transaction_name az COMMIT TRANSACTION adatbázismotor figyelmen kívül hagyja, külső tranzakció nevére hivatkozik, COMMIT TRANSACTION ha vannak függőben lévő belső tranzakciók, csak 1-gyel csökken @@TRANCOUNT .

Ha a COMMIT TRANSACTION nulla érték @@TRANCOUNT jelenik meg, az hibát eredményez, mert nincs megfelelő BEGIN TRANSACTION.

Az utasítás kiadása után COMMIT TRANSACTION nem állíthat vissza tranzakciót, mert az adatmódosítások már az adatbázis állandó részét képezik.

Megjegyzés:

Az adatbázismotor nem támogatja az egymástól függetlenül kezelhető beágyazott tranzakciókat. Belső tranzakciós decrements @@TRANCOUNT véglegesítés, de nincs más hatása. A belső tranzakciók visszaállítása mindig visszaállítja a külső tranzakciót, kivéve, ha létezik mentési pont , és az ROLLBACK utasításban meg van adva.

Permissions

Tagságot igényel a public szerepkörben.

Examples

A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.

A. Tranzakció véglegesítése

A következőkre vonatkozik: SQL Server, Azure SQL Database, Felügyelt Azure SQL-példány, SQL Database a Microsoft Fabricben, Azure Synapse Analytics, Analytics Platform System (PDW)

Az alábbi példa egy feladat-jelöltet töröl.

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

B. Külső tranzakció és belső tranzakciók véglegesítése

A következőkre vonatkozik: SQL Server, Azure SQL Database, Felügyelt Azure SQL-példány, SQL-adatbázis a Microsoft Fabricben.

Az alábbi példa létrehoz egy táblát, elindít egy külső és két belső tranzakciót, majd véglegesíti az egyes tranzakciókat. A példában használt transaction_name paraméterek segítenek a fejlesztőnek biztosítani, hogy a véglegesítések megfelelő száma 0-ra @@TRANCOUNT csökkenjen, és véglegesítse a külső tranzakciót.

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