Delen via


DOORVOERTRANSACTIE (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Magazijn in Microsoft FabricSQL-database in Microsoft Fabric Preview

Markeert het einde van een geslaagde impliciete of expliciete transactie. Als @@TRANCOUNT dit 1 is, COMMIT TRANSACTION brengt u alle gegevenswijzigingen aan sinds het begin van de transactie een permanent deel van de database, maakt u de resources van de transactie vrij en neemt u 0 af @@TRANCOUNT . Wanneer @@TRANCOUNT de waarde groter is dan 1, COMMIT TRANSACTION worden er slechts met 1 aflopen @@TRANCOUNT en blijft de transactie actief.

Transact-SQL syntaxis-conventies

Syntax

Syntaxis voor SQL Server, Azure SQL Database, SQL-database in Microsoft Fabric Preview.

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

Syntaxis voor Fabric Data Warehouse, Azure Synapse Analytics en parallelle datawarehouse-database.

COMMIT [ TRAN | TRANSACTION ]
[ ; ]

Arguments

transaction_name

Van toepassing op: SQL Server, Azure SQL Database, SQL database in Microsoft Fabric Preview.

Genegeerd door de SQL Server Database Engine. transaction_name geeft een transactienaam op die is toegewezen door een vorige BEGIN TRANSACTION. transaction_namemoet voldoen aan de regels voor id's, maar mag niet langer zijn dan 32 tekens. transaction_name geeft aan aan programmeurs waaraan de BEGIN TRANSACTION geneste COMMIT TRANSACTION is gekoppeld.

@tran_name_variable

Van toepassing op: SQL Server, Azure SQL Database, SQL database in Microsoft Fabric Preview.

De naam van een door de gebruiker gedefinieerde variabele met een geldige transactienaam. De variabele moet worden gedeclareerd met een gegevenstype char, varchar, nchar of nvarchar. Als er meer dan 32 tekens aan de variabele worden doorgegeven, worden er slechts 32 tekens gebruikt. De resterende tekens worden afgekapt.

WITH DELAYED_DURABILITY = { UIT | ON }

Van toepassing op: SQL Server, Azure SQL Database, SQL database in Microsoft Fabric Preview.

Optie die deze transactie aanvraagt, moet worden doorgevoerd met vertraagde duurzaamheid. De aanvraag wordt genegeerd als de database is gewijzigd met DELAYED_DURABILITY = DISABLED of DELAYED_DURABILITY = FORCED. Zie Control Transaction Durabilityvoor meer informatie.

Remarks

Het is de verantwoordelijkheid van de Transact-SQL programmeur om alleen op een punt uit te geven COMMIT TRANSACTION wanneer alle gegevens waarnaar wordt verwezen door de transactie logisch correct zijn.

Als de transactie een Transact-SQL gedistribueerde transactie was, COMMIT TRANSACTION activeert ms DTC om een doorvoerprotocol in twee fasen te gebruiken om alle servers die betrokken zijn bij de transactie door te voeren. Wanneer een lokale transactie twee of meer databases omvat op hetzelfde exemplaar van de database-engine, gebruikt het exemplaar een interne doorvoer in twee fasen om alle databases die betrokken zijn bij de transactie door te voeren.

Wanneer ze worden gebruikt in geneste transacties, maken doorvoeringen van de binnenste transacties geen resources vrij of brengen ze hun wijzigingen permanent aan. De gegevenswijzigingen worden permanent gemaakt en resources worden alleen vrijgemaakt wanneer de buitenste transactie wordt doorgevoerd. Elke COMMIT TRANSACTION afgegeven wanneer @@TRANCOUNT groter dan één is, wordt slechts met 1 verminderd @@TRANCOUNT . Wanneer @@TRANCOUNT tot slot wordt afgebroken tot 0, wordt de hele buitenste transactie doorgevoerd. Omdat transaction_name wordt genegeerd door de database-engine, geeft u een COMMIT TRANSACTION verwijzing naar de naam van een buitenste transactie wanneer er alleen openstaande binnentransacties met 1 worden afgetrokken @@TRANCOUNT .

Het uitgeven van een COMMIT TRANSACTION wanneer @@TRANCOUNT is nul resulteert in een fout; er is geen corresponderende BEGIN TRANSACTION.

U kunt een transactie niet terugdraaien nadat een COMMIT TRANSACTION instructie is uitgegeven, omdat de gegevens zijn gewijzigd in een permanent deel van de database.

Met de database-engine wordt het aantal transacties binnen een instructie alleen verhoogd wanneer het aantal transacties 0 is aan het begin van de instructie.

Permissions

Vereist lidmaatschap van de openbare rol.

Examples

De codevoorbeelden in dit artikel gebruiken de AdventureWorks2022 of AdventureWorksDW2022 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .

A. Een transactie doorvoeren

Van toepassing op: SQL Server, Azure SQL Database, Azure Synapse Analytics en Analytics Platform System (PDW)

In het volgende voorbeeld wordt een taakkandidaat verwijderd.

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

B. Een geneste transactie doorvoeren

Van toepassing op: SQL Server, Azure SQL Database, SQL database in Microsoft Fabric Preview.

In het volgende voorbeeld wordt een tabel gemaakt, worden drie niveaus van geneste transacties gegenereerd en wordt vervolgens de geneste transactie doorgevoerd. Hoewel elke COMMIT TRANSACTION instructie een transaction_name parameter heeft, is er geen relatie tussen de COMMIT TRANSACTION en BEGIN TRANSACTION instructies. De transaction_name parameters helpen de programmeur ervoor te zorgen dat het juiste aantal doorvoeringen wordt gecodeerd om te verlagen tot 0 en dus om de buitenste transactie door te @@TRANCOUNT voeren.

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