Dela via


COMMIT TRANSACTION (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)Lager i Microsoft FabricSQL-databas i Förhandsversion av Microsoft Fabric

Markerar slutet på en implicit eller explicit transaktion. Om @@TRANCOUNT är 1 gör COMMIT TRANSACTION du alla dataändringar sedan transaktionens början till en permanent del av databasen, frigör transaktionens resurser och minskar @@TRANCOUNT till 0. När @@TRANCOUNT är större än 1 COMMIT TRANSACTION minskar @@TRANCOUNT bara med 1 och transaktionen förblir aktiv.

Transact-SQL syntaxkonventioner

Syntax

Syntax för SQL Server, Azure SQL Database, SQL Database i Förhandsversionen av Microsoft Fabric.

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

Syntax för Fabric Data Warehouse, Azure Synapse Analytics och Parallel Data Warehouse Database.

COMMIT [ TRAN | TRANSACTION ]
[ ; ]

Arguments

transaction_name

Gäller för: SQL Server, Azure SQL Database, SQL Database i Microsoft Fabric Preview.

Ignoreras av SQL Server Database Engine. transaction_name anger ett transaktionsnamn som tilldelats av en tidigare BEGIN TRANSACTION. transaction_namemåste följa reglerna för identifierare, men får inte överstiga 32 tecken. transaction_name anger för programmerare som kapslade BEGIN TRANSACTION är COMMIT TRANSACTION associerade med.

@tran_name_variable

Gäller för: SQL Server, Azure SQL Database, SQL Database i Microsoft Fabric Preview.

Namnet på en användardefinierad variabel som innehåller ett giltigt transaktionsnamn. Variabeln måste deklareras med datatypen char, varchar, nchar eller nvarchar. Om fler än 32 tecken skickas till variabeln används endast 32 tecken. Återstående tecken trunkeras.

MED DELAYED_DURABILITY = { OFF | PÅ }

Gäller för: SQL Server, Azure SQL Database, SQL Database i Microsoft Fabric Preview.

Alternativ som begär den här transaktionen bör genomföras med fördröjd hållbarhet. Begäran ignoreras om databasen har ändrats med DELAYED_DURABILITY = DISABLED eller DELAYED_DURABILITY = FORCED. Mer information finns i Kontrollera transaktionshållbarhet.

Remarks

Det är Transact-SQL programmerarens ansvar att endast utfärda COMMIT TRANSACTION vid en tidpunkt då alla data som refereras till av transaktionen är logiskt korrekta.

Om transaktionen som checkats in var en Transact-SQL distribuerad transaktion utlöser COMMIT TRANSACTION MS DTC att använda ett incheckningsprotokoll med två faser för att genomföra alla servrar som ingår i transaktionen. När en lokal transaktion sträcker sig över två eller flera databaser på samma instans av databasmotorn använder instansen en intern tvåfas incheckning för att genomföra alla databaser som ingår i transaktionen.

När de används i kapslade transaktioner frigör inte incheckningar av de inre transaktionerna resurser eller gör ändringarna permanenta. Dataändringarna görs permanenta och resurser frigörs endast när den yttre transaktionen har checkats in. Var och COMMIT TRANSACTION en utfärdas när @@TRANCOUNT är större än en helt enkelt minskar @@TRANCOUNT med 1. När @@TRANCOUNT slutligen minskas till 0 checkas hela den yttre transaktionen in. Eftersom transaction_name ignoreras av databasmotorn utfärdar du en COMMIT TRANSACTION referens till namnet på en yttre transaktion när det bara finns utestående inre transaktioner som minskar @@TRANCOUNT med 1.

Att utfärda ett COMMIT TRANSACTION när @@TRANCOUNT är noll resulterar i ett fel. Det finns ingen motsvarande BEGIN TRANSACTION.

Du kan inte återställa en transaktion när en COMMIT TRANSACTION instruktion har utfärdats, eftersom dataändringarna har gjorts som en permanent del av databasen.

Databasmotorn ökar transaktionsantalet i en -instruktion endast när transaktionsantalet är 0 i början av -instruktionen.

Permissions

Kräver medlemskap i offentlig roll.

Examples

Kodexemplen i den här artikeln använder AdventureWorks2022- eller AdventureWorksDW2022-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.

A. Checka in en transaktion

Gäller för: SQL Server, Azure SQL Database, Azure Synapse Analytics och Analytics Platform System (PDW)

I följande exempel tas en jobbkandidat bort.

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

B. Checka in en kapslad transaktion

Gäller för: SQL Server, Azure SQL Database, SQL Database i Microsoft Fabric Preview.

I följande exempel skapas en tabell, tre nivåer av kapslade transaktioner genereras och den kapslade transaktionen checkas sedan in. Även om varje COMMIT TRANSACTION -instruktion har en transaction_name parameter finns det ingen relation mellan - och COMMIT TRANSACTION -uttryckenBEGIN TRANSACTION. De transaction_name parametrarna hjälper programmeraren att se till att rätt antal incheckningar kodas för att minska @@TRANCOUNT till 0 och så att den yttre transaktionen genomförs.

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