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