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 @@TRANCOUNT się o 1, COMMIT TRANSACTION a transakcja pozostaje aktywna.

Transact-SQL konwencje składni

Syntax

Składnia dla programu SQL Server, usługi Azure SQL Database, usługi Azure SQL Managed Instance, bazy danych SQL w usłudze 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: SQL Server 2008 (10.0.x) i nowsze wersje, Azure SQL Database, Azure SQL Managed Instance, SQL Database w usłudze Microsoft Fabric.

Ignorowane przez aparat bazy danych po określeniu za pomocą COMMITpolecenia . transaction_name określa nazwę transakcji przypisaną przez poprzedni BEGIN TRANSACTIONelement . transaction_name musi być zgodna z regułami identyfikatorów, ale nie może przekraczać 32 znaków. transaction_name można użyć jako techniki dokumentacji kodu, aby wskazać, z którymi instrukcjami COMMIT TRANSACTION wewnętrznymi BEGIN TRANSACTION jest skojarzona instrukcja.

@tran_name_variable

Dotyczy: SQL Server 2008 (10.0.x) i nowsze wersje, Azure SQL Database, Azure SQL Managed Instance, SQL Database w usłudze 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 pierwsze 32 znaki. Pozostałe znaki są obcinane.

WITH DELAYED_DURABILITY = { OFF | WŁ. }

Dotyczy: SQL Server 2008 (10.0.x) i nowsze wersje, Azure SQL Database, Azure SQL Managed Instance, SQL Database w usłudze Microsoft Fabric.

Opcja, która żąda zatwierdzenia tej transakcji z opóźnionym trwałością. Żądanie jest ignorowane, jeśli opóźniona trwałość jest wyłączona dla bazy danych. Transakcja jest zatwierdzana z opóźnieniem trwałości niezależnie od tej opcji, jeśli opóźniona trwałość jest wymuszana dla bazy danych.

Aby uzyskać więcej informacji, zobacz Kontrola Trwałości Transakcji.

Remarks

Obowiązkiem aplikacji jest wystawianie COMMIT TRANSACTION w momencie, gdy wszystkie dane, do których odwołuje się transakcja, osiągną zamierzony stan spójności.

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 transakcji na wszystkich serwerach 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 transakcji we wszystkich bazach danych zaangażowanych w transakcję.

W przypadku transakcji wewnętrznych zatwierdzenie nie zwalnia zasobów ani nie wprowadza trwałych modyfikacji danych. Modyfikacje danych są trwałe, a zasoby są zwalniane tylko wtedy, gdy transakcja zewnętrzna zostanie zatwierdzona. Każdy COMMIT TRANSACTION wystawiony, gdy @@TRANCOUNT jest większy niż 1 dekrementuje @@TRANCOUNT o 1, ale nie ma innych efektów. Gdy @@TRANCOUNT wartość zostanie ostatecznie zdekrementowana na 0, cała zewnętrzna transakcja zostanie zatwierdzona. Ponieważ transaction_name określony COMMIT TRANSACTION za pomocą 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 się o 1.

Wystawianie parametru COMMIT TRANSACTION , gdy @@TRANCOUNT wartość jest równa zero powoduje błąd, ponieważ nie ma odpowiadającego mu BEGIN TRANSACTIONelementu .

Nie można wycofać transakcji po wydaniu COMMIT TRANSACTION instrukcji, ponieważ modyfikacje danych są już stałą częścią bazy danych.

Uwaga / Notatka

Aparat bazy danych nie obsługuje niezależnie zarządzanych zagnieżdżonych transakcji. Zatwierdzenie wewnętrznego dekrementowania @@TRANCOUNT transakcji, ale nie ma innych efektów. Wycofanie transakcji wewnętrznej zawsze cofa zewnętrzną transakcję, chyba że istnieje punkt zapisywania i jest określony w instrukcji ROLLBACK .

Permissions

Wymaga członkostwa w public 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 SQL Managed Instance, BAZA danych SQL w usłudze Microsoft Fabric, Azure Synapse Analytics, 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 transakcji zewnętrznej i transakcji wewnętrznych

Dotyczy: SQL Server, Azure SQL Database, Azure SQL Managed Instance, SQL Database w usłudze Microsoft Fabric.

Poniższy przykład tworzy tabelę, uruchamia zewnętrzne i dwie transakcje wewnętrzne, a następnie zatwierdza każdą transakcję. Parametry transaction_name używane w tym przykładzie pomagają deweloperowi upewnić się, że prawidłowa liczba zatwierdzeń jest kodowana w celu dekrementacji @@TRANCOUNT wartości 0 i zatwierdzenia transakcji zewnętrznej.

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