標志一個成功的隱性事務或用戶定義事務的結束。如果 @@TRANCOUNT 為 1,COMMIT TRANSACTION 使得自從事務開始以來所執(zhí)行的所有數(shù)據(jù)修改成為數(shù)據(jù)庫的永久部分,釋放連接占用的資源,并將 @@TRANCOUNT 減少到 0。如果 @@TRANCOUNT 大于 1,則 COMMIT TRANSACTION 使 @@TRANCOUNT 按 1 遞減。
COMMIT [ TRAN [ SACTION ] [ transaction_name | @tran_name_variable ] ]
transaction_name
Microsoft® SQL Server™ 忽略該參數(shù)。transaction_name 指定由前面的 BEGIN TRANSACTION 指派的事務名稱。transaction_name 必須遵循標識符的規(guī)則,但只使用事務名稱的前 32 個字符。通過向程序員指明 COMMIT TRANSACTION 與哪些嵌套的 BEGIN TRANSACTION 相關聯(lián),transaction_name 可作為幫助閱讀的一種方法。
@tran_name_variable
是用戶定義的、含有有效事務名稱的變量的名稱。必須用 char、varchar、nchar 或 nvarchar 數(shù)據(jù)類型聲明該變量。
只有當事務所引用的所有數(shù)據(jù)的邏輯都正確時,發(fā)出 COMMIT TRANSACTION 命令才是一個 Transact-SQL 程序員的職責。
如果所提交的事務是 Transact-SQL 分布式事務,COMMIT TRANSACTION 將觸發(fā) MS DTC 使用兩階段提交協(xié)議,以便提交所有涉及該事務的服務器。如果局部事務跨越同一服務器上的兩個或多個數(shù)據(jù)庫,那么 SQL Server 將使用內部的兩階段提交來提交所有涉及該事務的數(shù)據(jù)庫。
當在嵌套事務中使用時,內部事務的提交并不釋放資源或使其修改成為永久修改。只有在提交了外部事務時,數(shù)據(jù)修改才具有永久性,而且資源才會被釋放。當 @@TRANCOUNT 大于 1 時,每發(fā)出一個 COMMIT TRANSACTION 命令就會使 @@TRANCOUNT 按 1 遞減。當 @@TRANCOUNT 最終減少到 0 時,將提交整個外部事務。因為 transaction_name 被 SQL Server 忽略,所以當存在僅將 @@TRANCOUNT 按 1 遞減的顯著內部事務時,發(fā)出一個引用外部事務名稱的 COMMIT TRANSACTION。
當 @@TRANCOUNT 為 0 時發(fā)出 COMMIT TRANSACTION 將會導致出現(xiàn)錯誤,因為沒有相應的 BEGIN TRANSACTION。
不能在發(fā)出一個 COMMIT TRANSACTION 語句之后回滾事務,因為數(shù)據(jù)修改已經(jīng)成為數(shù)據(jù)庫的一個永久部分。
下面的示例在圖書的截止當前銷售額超過 $8,000 時,增加支付給作者的預付款。
BEGIN TRANSACTION
USE pubs
GO
UPDATE titles
SET advance = advance * 1.25
WHERE ytd_sales > 8000
GO
COMMIT
GO
下面的示例創(chuàng)建一個表,生成三個級別的嵌套事務,然后提交該嵌套事務。盡管每個 COMMIT TRANSACTION 語句都有一個 transaction_name 參數(shù),但是 COMMIT TRANSACTION 和 BEGIN TRANSACTION 語句之間沒有任何關系。transaction_name 參數(shù)僅是幫助閱讀的方法,可幫助程序員確保提交的正確號碼被編碼以便將 @@TRANCOUNT 減少到 0,然后提交外部事務。
CREATE TABLE TestTran (Cola INT PRIMARY KEY, Colb CHAR(3))
GO
BEGIN TRANSACTION OuterTran -- @@TRANCOUNT set to 1.
GO
INSERT INTO TestTran VALUES (1, 'aaa')
GO
BEGIN TRANSACTION Inner1 -- @@TRANCOUNT set to 2.
GO
INSERT INTO TestTran VALUES (2, 'bbb')
GO
BEGIN TRANSACTION Inner2 -- @@TRANCOUNT set to 3.
GO
INSERT INTO TestTran VALUES (3, 'ccc')
GO
COMMIT TRANSACTION Inner2 -- Decrements @@TRANCOUNT to 2.
-- Nothing committed.
GO
COMMIT TRANSACTION Inner1 -- Decrements @@TRANCOUNT to 1.
-- Nothing committed.
GO
COMMIT TRANSACTION OuterTran -- Decrements @@TRANCOUNT to 0.
-- Commits outer transaction OuterTran.
GO
相關文章