標(biāo)記一個(gè)顯式本地事務(wù)的起始點(diǎn)。BEGIN TRANSACTION將 @@TRANCOUNT 加 1。
BEGIN TRAN [ SACTION ] [ transaction_name | @tran_name_variable
[ WITH MARK [ 'description' ] ] ]
transaction_name
是給事務(wù)分配的名稱。transaction_name 必須遵循標(biāo)識(shí)符規(guī)則,但是不允許標(biāo)識(shí)符多于 32 個(gè)字符。僅在嵌套的 BEGIN...COMMIT 或 BEGIN...ROLLBACK 語句的最外語句對上使用事務(wù)名。
@tran_name_variable
是用戶定義的、含有有效事務(wù)名稱的變量的名稱。必須用 char、varchar、nchar 或 nvarchar 數(shù)據(jù)類型聲明該變量。
WITH MARK ['description']
指定在日志中標(biāo)記事務(wù)。Description 是描述該標(biāo)記的字符串。
如果使用了 WITH MARK,則必須指定事務(wù)名。WITH MARK 允許將事務(wù)日志還原到命名標(biāo)記。
BEGIN TRANSACTION 代表一點(diǎn),由連接引用的數(shù)據(jù)在該點(diǎn)是邏輯和物理上都一致的。如果遇上錯(cuò)誤,在 BEGIN TRANSACTION 之后的所有數(shù)據(jù)改動(dòng)都能進(jìn)行回滾,以將數(shù)據(jù)返回到已知的一致狀態(tài)。每個(gè)事務(wù)繼續(xù)執(zhí)行直到它無誤地完成并且用 COMMIT TRANSACTION 對數(shù)據(jù)庫作永久的改動(dòng),或者遇上錯(cuò)誤并且用 ROLLBACK TRANSACTION 語句擦除所有改動(dòng)。
BEGIN TRANSACTION 為使用本語句的連接啟動(dòng)一個(gè)本地事務(wù)。根據(jù)當(dāng)前事務(wù)隔離級別的設(shè)置情況,為支持該連接所發(fā)出的 Transact-SQL 語句而獲取的許多資源被該事務(wù)鎖定,直到此事務(wù)以 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 語句完成。長時(shí)間處于等待處理狀態(tài)的事務(wù)會(huì)阻止其他用戶訪問鎖定的資源。
雖然 BEGIN TRANSACTION 啟動(dòng)一個(gè)本地事務(wù),但是在應(yīng)用程序接下來執(zhí)行了一個(gè)必須記錄的操作(如執(zhí)行 INSERT、UPDATE 或 DELETE 語句)之前,它并不被記錄在事務(wù)日志中。應(yīng)用程序能執(zhí)行一些操作,例如為了保護(hù) SELECT 語句的事務(wù)隔離級別而獲取鎖,但是直到應(yīng)用程序執(zhí)行一個(gè)修改操作日志中才有記錄。
在一系列嵌套的事務(wù)中用一個(gè)事務(wù)名給多個(gè)事務(wù)命名對該事務(wù)沒有什么影響。系統(tǒng)僅登記第一個(gè)(最外部的)事務(wù)名?;貪L到其它任何名字(有效的保存點(diǎn)名除外)都會(huì)產(chǎn)生錯(cuò)誤。事實(shí)上,任何在回滾之前執(zhí)行的語句都沒有在錯(cuò)誤發(fā)生時(shí)回滾。這些語句僅當(dāng)外層的事務(wù)回滾時(shí)才會(huì)進(jìn)行回滾。
BEGIN TRANSACTION 啟動(dòng)一個(gè)本地事務(wù)。如果在事務(wù)提交或回滾之前執(zhí)行了如下操作,本地事務(wù)將升級到分布式事務(wù):
SQL Server 的本地復(fù)本成為事務(wù)控制器并且使用 MS DTC 來管理該分布式事務(wù)。
WITH MARK 選項(xiàng)使事務(wù)名置于事務(wù)日志中。將數(shù)據(jù)庫還原到早期狀態(tài)時(shí),可使用標(biāo)記事務(wù)替代日期和時(shí)間。有關(guān)更多信息,請參見將數(shù)據(jù)庫還原到前一個(gè)狀態(tài)、恢復(fù)到命名事務(wù)和 RESTORE。
另外,若要將一組相關(guān)數(shù)據(jù)庫恢復(fù)到邏輯上一致的狀態(tài),必須使用事務(wù)日志標(biāo)記。標(biāo)記可由分布式事務(wù)置于相關(guān)數(shù)據(jù)庫的事務(wù)日志中。將這組相關(guān)數(shù)據(jù)庫恢復(fù)到這些標(biāo)記將產(chǎn)生一組在事務(wù)上一致的數(shù)據(jù)庫。在相關(guān)數(shù)據(jù)庫中放置標(biāo)記需要特殊的過程。有關(guān)更多信息,請參見"相關(guān)數(shù)據(jù)庫的備份和恢復(fù)"。
只有當(dāng)數(shù)據(jù)庫由標(biāo)記事務(wù)更新時(shí),才在事務(wù)日志中放置標(biāo)記。不修改數(shù)據(jù)的事務(wù)不被標(biāo)記。
在已存在的未標(biāo)記事務(wù)中可以嵌套 BEGIN TRAN new_name WITH MARK。嵌套后,new_name 便成為事務(wù)的標(biāo)記名,不論是否已為事務(wù)提供了該名稱。在下例中,M2 是標(biāo)記名。
BEGIN TRAN T1
UPDATE table1 ...
BEGIN TRAN M2 WITH MARK
UPDATE table2 ...
SELECT * from table1
COMMIT TRAN M2
UPDATE table3 ...
COMMIT TRAN T1
嘗試標(biāo)記已標(biāo)記的事務(wù)將產(chǎn)生警告(非錯(cuò)誤)消息:
BEGIN TRAN T1 WITH MARK
UPDATE table1 ...
BEGIN TRAN M2 WITH MARK
Server: Msg 3920, Level 16, State 1, Line 3
WITH MARK option only applies to the first BEGIN TRAN WITH MARK.
The option is ignored.
任何有效的用戶都具有默認(rèn)的 BEGIN TRANSACTION 權(quán)限。