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