COMMIT TRANSACTION (Transact-SQL)
標示順利完成的隱含或明確的交易結束。 如果 @@TRANCOUNT 是 1,COMMIT TRANSACTION 會使交易開始之後所執行的所有資料修改成為資料庫永久的部份、釋出交易所保留的資源,再將 @@TRANCOUNT 減量為 0。 如果 @@TRANCOUNT 大於 1,COMMIT TRANSACTION 只會將 @@TRANCOUNT 減量 1,而且交易會維持使用中的狀態。
適用於:SQL Server (SQL Server 2008 至目前版本)、Azure SQL Database (初始版本至目前版本)。 |
語法
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)
ROLLBACK TRANSACTION (Transact-SQL)