共用方式為


COMMIT TRANSACTION (Transact-SQL)

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

適用於:SQL Server (SQL Server 2008 至目前版本)、Azure SQL Database (初始版本至目前版本)。

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

語法

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

引數

  • 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 個字元;其餘字元會截斷。

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

備註

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 陳述式之後回復交易,因為資料修改已成為資料庫的永久部份。

只有在陳述式開始時交易計數是 0 時,Database Engine 才會在單一陳述式內遞增交易。

權限

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

範例

A.認可交易

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

USE AdventureWorks2012;
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 AdventureWorks2012;
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

請參閱

參考

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)

BEGIN TRANSACTION (Transact-SQL)

COMMIT WORK (Transact-SQL)

ROLLBACK TRANSACTION (Transact-SQL)

ROLLBACK WORK (Transact-SQL)

SAVE TRANSACTION (Transact-SQL)

@@TRANCOUNT (Transact-SQL)