COMMIT TRANSACTION (Transact-SQL)
標示順利完成的隱含或明確的交易結束。如果 @@TRANCOUNT 是 1,COMMIT TRANSACTION 會使交易開始之後所執行的所有資料修改成為資料庫永久的部份,釋出交易所保留的資源,再將 @@TRANCOUNT 減量為 0。如果 @@TRANCOUNT 大於 1,COMMIT TRANSACTION 只會將 @@TRANCOUNT 減量 1,交易會維持使用中的狀態。
語法
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 TEANSACTION 陳述式,使用者可能會見到不同於 SQL Server 7.0 版中的行為。不建議您將 COMMIT TRANSACTION 或 COMMIT WORK 陳述式放在觸發程序中。
權限
需要 public 角色中的成員資格。
範例
A. 認可交易
這個範例會刪除作業候選項。
USE AdventureWorks;
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 AdventureWorks;
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)