COMMIT TRANSACTION (Transact-SQL)

適用於:Microsoft Fabric 中的 SQL ServerAzure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics AnalyticsPlatform System (PDW)Warehouse

標示順利完成的隱含或明確的交易結束。 如果 @@TRANCOUNT 為 1, COMMIT TRANSACTION 則會在交易開始後進行所有數據修改,成為資料庫的永久部分、釋放交易的資源,並將遞減 @@TRANCOUNT 為 0。 當 @@TRANCOUNT 大於 1 時, COMMIT TRANSACTION 只會遞減 @@TRANCOUNT 1,且交易會保持作用中。

Transact-SQL 語法慣例

Syntax

SQL Server 和 Azure SQL Database 的語法。

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

Microsoft Fabric、Azure Synapse Analytics 和平行處理數據倉儲資料庫的 Synapse 數據倉儲語法。

COMMIT [ TRAN | TRANSACTION ]
[ ; ]

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

引數

transaction_name

適用於:SQL Server 和 Azure SQL Database

SQL Server 資料庫引擎 忽略。 transaction_name指定先前 BEGIN TRANSACTION指派的交易名稱。 transaction_name 必須符合識別碼規則,但不能超過 32 個字元。 transaction_name會向巢狀BEGIN TRANSACTIONCOMMIT TRANSACTION的程式設計人員指出與其建立關聯的 。

@tran_name_variable

適用於:SQL Server 和 Azure SQL Database

包含有效交易名稱的使用者定義變數名稱。 這個變數必須用 char、varchar、nchar 或 nvarchar 資料類型來宣告。 如果將超過 32 個字元傳遞至變數,則只會使用 32 個字元。 其餘字元會被截斷。

WITH DELAYED_DURABILITY = { OFF |ON }

適用於:SQL Server 和 Azure SQL Database

要求這筆交易應延遲持久性認可的選項。 如果使用 或DELAYED_DURABILITY = FORCED更改DELAYED_DURABILITY = DISABLED資料庫,則會忽略要求。 如需詳細資訊,請參閱控制交易持久性

備註

只有在交易所參考的所有數據都符合邏輯正確時,Transact-SQL 程式設計人員才有責任發出 COMMIT TRANSACTION 問題。

如果認可的交易是 Transact-SQL 分散式交易, COMMIT TRANSACTION 則觸發 MS DTC 使用雙階段認可通訊協議來認可交易所涉及的所有伺服器。 當本機交易跨越相同資料庫引擎執行個體的兩個或更多資料庫時,執行個體會利用內部的兩階段交易認可,認可與交易有關的所有資料庫。

用於巢狀交易時,認可內部交易並不會釋出資源,或永久修改它們。 只有在認可外部交易時,才會使資料修改永久化及釋出資源。 當大於 1 時所發出的@@TRANCOUNTCOMMIT TRANSACTION一個只會遞減 @@TRANCOUNT 1。 當 最後遞減至 0 時 @@TRANCOUNT ,會認可整個外部交易。 因為 資料庫引擎 會忽略transaction_name,因此當有未完成的內部交易只會遞減 @@TRANCOUNT 1 時,發出COMMIT TRANSACTION參考外部交易的名稱。

COMMIT TRANSACTION@@TRANCOUNT當為零時發出 會導致錯誤;沒有對應的 BEGIN TRANSACTION

您無法在發出語句之後 COMMIT TRANSACTION 回復交易,因為數據修改已成為資料庫的永久部分。

只有在陳述式開頭的交易計數是 0 時,資料庫引擎才會在陳述式內增加交易。

權限

需要 public 角色的成員資格。

範例

本文需要AdventureWorks2022範例資料庫,您可以從 Microsoft SQL Server Samples 和 Community Projects (Microsoft SQL Server 範例和社群專案)首頁下載。

A. 認可交易

適用於:SQL Server、Azure SQL Database、Azure Synapse Analytics 和 Analytics Platform System (PDW)

下列範例會刪除作業候選項。

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

B. 認可巢狀交易

適用於:SQL Server 和 Azure SQL Database

此範例會建立一份資料表,並產生三個層級的巢狀交易,再認可巢狀交易。 雖然每個 COMMIT TRANSACTION 陳述式都有 transaction_name 參數,但是 COMMIT TRANSACTIONBEGIN TRANSACTION 陳述式之間並沒有關聯性。 transaction_name 參數協助程式設計人員確認已撰寫正確認可數目的程式碼,將 @@TRANCOUNT 減量到 0,以便認可外部交易。

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