COMMIT TRANSACTION (Transact-SQL)

標示順利完成的隱含或明確的交易結束。如果 @@TRANCOUNT 是 1,COMMIT TRANSACTION 會使交易開始之後所執行的所有資料修改成為資料庫永久的部份、釋出交易所保留的資源,再將 @@TRANCOUNT 減量為 0。如果 @@TRANCOUNT 大於 1,COMMIT TRANSACTION 只會將 @@TRANCOUNT 減量 1,而且交易會維持使用中的狀態。

主題連結圖示Transact-SQL 語法慣例

語法

COMMIT { TRAN | TRANSACTION } [ transaction_name | @tran_name_variable ] ]
[ ; ]

引數

  • transaction_name
    SQL Server Database Engine 會忽略這個項目。transaction_name 指定先前的 BEGIN TRANSACTION 所指派的交易名稱。transaction_name 必須符合識別碼的規則,但不能超出 32 個字元。transaction_name 可用來當做可讀性的輔助,向程式設計人員指出 COMMIT TRANSACTION 與哪一個巢狀 BEGIN TRANSACTION 有關聯。

  • @tran_name_variable
    這是包含有效交易名稱之使用者定義變數的名稱。這個變數必須用 char、varchar、nchar 或 nvarchar 資料類型來宣告。如果超出 32 個字元傳給變數,只會使用 32 個字元;其餘字元會截斷。

備註

Transact-SQL 程式設計人員負責只在交易所參考的所有資料都邏輯正確時,才發出 COMMIT TRANSACTION。

如果認可的交易是一項 Transact-SQL 分散式交易,COMMIT TRANSACTION 會觸發 MS DTC 利用兩階段認可通訊協定來認可交易所涉及的所有伺服器。如果本機交易跨越相同 Database Engine 執行個體的兩個或更多資料庫,執行個體會利用兩階段認可來認可交易所涉及的所有資料庫。

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

當 @@TRANCOUNT 是 0 時,發出 COMMIT TRANSACTION 會產生錯誤;沒有對應的 BEGIN TRANSACTION。

您不能在發出 COMMIT TRANSACTION 陳述式之後回復交易,因為資料修改已成為資料庫的永久部份。

在 SQL Server 2000 和更新版本中,只有在陳述式開始時交易計數是 0 時,Database Engine 才會在單一陳述式內遞增交易。在 SQL Server 7.0 版中,不論陳述式開始時的交易計數為何,交易計數一定會遞增。這可能使 SQL Server 2000 和更新版本中,由觸發程序的 @@TRANCOUNT 所傳回的值低於在 SQL Server 7.0 版中所傳回的值。

在 SQL Server 2000 和更新的版本中,如果在觸發程序內執行 COMMIT TRANSACTION 或 COMMIT WORK 陳述式,且觸發程序開頭沒有對應的明確或隱含的 BEGIN TRANSACTION 陳述式,使用者可能會見到不同於 SQL Server 7.0 版中的行為。不建議您將 COMMIT TRANSACTION 或 COMMIT WORK 陳述式放在觸發程序中。

權限

需要 public 角色中的成員資格。

範例

A. 認可交易

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

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

B. 認可巢狀交易

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

USE AdventureWorks2008R2;
GO
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;
GO
PRINT N'Transaction count after BEGIN OuterTran = '
    + CAST(@@TRANCOUNT AS nvarchar(10));
GO
INSERT INTO TestTran VALUES (1, 'aaa');
GO
-- This statement sets @@TRANCOUNT to 2.
BEGIN TRANSACTION Inner1;
GO
PRINT N'Transaction count after BEGIN Inner1 = '
    + CAST(@@TRANCOUNT AS nvarchar(10));
GO
INSERT INTO TestTran VALUES (2, 'bbb');
GO
-- This statement sets @@TRANCOUNT to 3.
BEGIN TRANSACTION Inner2;
GO
PRINT N'Transaction count after BEGIN Inner2 = '
    + CAST(@@TRANCOUNT AS nvarchar(10));
GO
INSERT INTO TestTran VALUES (3, 'ccc');
GO
-- This statement decrements @@TRANCOUNT to 2.
-- Nothing is committed.
COMMIT TRANSACTION Inner2;
GO
PRINT N'Transaction count after COMMIT Inner2 = '
    + CAST(@@TRANCOUNT AS nvarchar(10));
GO
-- This statement decrements @@TRANCOUNT to 1.
-- Nothing is committed.
COMMIT TRANSACTION Inner1;
GO
PRINT N'Transaction count after COMMIT Inner1 = '
    + CAST(@@TRANCOUNT AS nvarchar(10));
GO
-- This statement decrements @@TRANCOUNT to 0 and
-- commits outer transaction OuterTran.
COMMIT TRANSACTION OuterTran;
GO
PRINT N'Transaction count after COMMIT OuterTran = '
    + CAST(@@TRANCOUNT AS nvarchar(10));
GO