Udostępnij za pomocą


TRANSAKCJA COMMIT (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Magazyn w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Oznacza koniec pomyślnej transakcji niejawnej lub jawnej. Jeśli @@TRANCOUNT wartość to 1, COMMIT TRANSACTION wprowadza wszystkie modyfikacje danych od początku transakcji stałą część bazy danych, zwalnia zasoby transakcji i dekrementuje @@TRANCOUNT wartość 0. Gdy @@TRANCOUNT wartość jest większa niż 1, dekrementuje COMMIT TRANSACTION tylko wartość 1, @@TRANCOUNT a transakcja pozostaje aktywna.

Transact-SQL konwencje składni

Syntax

Syntax for SQL Server, Azure SQL Database, SQL database in Microsoft Fabric.

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

Składnia magazynu danych sieci szkieletowej, usługi Azure Synapse Analytics i równoległej bazy danych magazynu danych.

COMMIT [ TRAN | TRANSACTION ]
[ ; ]

Arguments

transaction_name

Dotyczy do: SQL Server, Azure SQL Database, SQL database in Microsoft Fabric.

Ignorowane przez aparat bazy danych programu SQL Server. transaction_name określa nazwę transakcji przypisaną przez poprzedni BEGIN TRANSACTIONelement . transaction_namemusi być zgodna z regułami identyfikatorów, ale nie może przekraczać 32 znaków. transaction_name wskazuje programistom, z którymi zagnieżdżona jest skojarzona BEGIN TRANSACTIONCOMMIT TRANSACTION .

@tran_name_variable

Dotyczy do: SQL Server, Azure SQL Database, SQL database in Microsoft Fabric.

Nazwa zmiennej zdefiniowanej przez użytkownika zawierająca prawidłową nazwę transakcji. Zmienna musi być zadeklarowana przy użyciu typu danych char, varchar, nchar lub nvarchar. Jeśli do zmiennej jest przekazywanych więcej niż 32 znaki, używane są tylko 32 znaki. Pozostałe znaki są obcinane.

WITH DELAYED_DURABILITY = { OFF | WŁ. }

Dotyczy do: SQL Server, Azure SQL Database, SQL database in Microsoft Fabric.

Opcja żądającą tego transakcji powinna zostać zatwierdzona z opóźnionym trwałością. Żądanie jest ignorowane, jeśli baza danych została zmieniona za pomocą DELAYED_DURABILITY = DISABLED polecenia lub DELAYED_DURABILITY = FORCED. Aby uzyskać więcej informacji, zobacz Kontrola Trwałości Transakcji.

Remarks

Jest to odpowiedzialność programisty Transact-SQL wystawiać COMMIT TRANSACTION tylko w momencie, gdy wszystkie dane, do których odwołuje się transakcja, są logicznie poprawne.

Jeśli transakcja zatwierdzona była Transact-SQL transakcji rozproszonej, COMMIT TRANSACTION wyzwala usługę MS DTC, aby użyć dwufazowego protokołu zatwierdzania w celu zatwierdzenia wszystkich serwerów zaangażowanych w transakcję. Gdy transakcja lokalna obejmuje co najmniej dwie bazy danych w tym samym wystąpieniu aparatu bazy danych, wystąpienie używa wewnętrznego zatwierdzenia dwufazowego w celu zatwierdzenia wszystkich baz danych zaangażowanych w transakcję.

W przypadku użycia w transakcjach zagnieżdżonych zatwierdzenia transakcji wewnętrznych nie zwalniają zasobów ani nie tworzą trwałych modyfikacji. Modyfikacje danych są wprowadzane na stałe i zasoby zwalniane tylko wtedy, gdy transakcja zewnętrzna zostanie zatwierdzona. Każdy COMMIT TRANSACTION wystawiony, gdy @@TRANCOUNT jest większy niż jeden po prostu dekrementuje @@TRANCOUNT o 1. Gdy @@TRANCOUNT wartość zostanie ostatecznie zdekrementowana na 0, cała zewnętrzna transakcja zostanie zatwierdzona. Ponieważ transaction_name jest ignorowany przez aparat bazy danych, wystawiając COMMIT TRANSACTION odwołanie do nazwy transakcji zewnętrznej, gdy istnieją zaległe transakcje wewnętrzne tylko dekrementuje @@TRANCOUNT o 1.

Wystawianie parametru COMMIT TRANSACTION , gdy @@TRANCOUNT wartość jest równa zero powoduje błąd; nie ma odpowiedniego BEGIN TRANSACTIONelementu .

Nie można wycofać transakcji po wydaniu COMMIT TRANSACTION instrukcji, ponieważ modyfikacje danych zostały wprowadzone w stałej części bazy danych.

Aparat bazy danych zwiększa liczbę transakcji w ramach instrukcji tylko wtedy, gdy liczba transakcji wynosi 0 na początku instrukcji.

Permissions

Wymaga członkostwa w publicznej roli .

Examples

Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2025 lub AdventureWorksDW2025, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.

A. Zatwierdzanie transakcji

Dotyczy: SQL Server, Azure SQL Database, Azure Synapse Analytics i Analytics Platform System (PDW)

Poniższy przykład usuwa kandydata do pracy.

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

B. Zatwierdzanie zagnieżdżonej transakcji

Dotyczy do: SQL Server, Azure SQL Database, SQL database in Microsoft Fabric.

Poniższy przykład tworzy tabelę, generuje trzy poziomy zagnieżdżonych transakcji, a następnie zatwierdza zagnieżdżonych transakcji. Mimo że każda COMMIT TRANSACTION instrukcja ma parametr transaction_name , nie ma relacji między instrukcjami COMMIT TRANSACTION i BEGIN TRANSACTION . Parametry transaction_name pomagają programisty upewnić się, że prawidłowa liczba zatwierdzeń jest kodowana w celu dekrementacji @@TRANCOUNT do 0 i tak, aby zatwierdzić transakcję zewnętrzną.

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