标記一個顯式本地事務的起始點。BEGIN TRANSACTION 使 @@TRANCOUNT 按 1 遞增。

Transact-SQL 文法約定
文法
BEGIN { TRAN | TRANSACTION }
[ { transaction_name | @tran_name_variable }
[ WITH MARK [ 'description' ] ]
]
[ ; ]
參數
- transaction_name
- 配置設定給事務的名稱。transaction_name 必須符合辨別符規則,但辨別符所包含的字元數不能大于 32。僅在最外面的 BEGIN...COMMIT 或 BEGIN...ROLLBACK 嵌套語句對中使用事務名。
- @tran_name_variable
- 使用者定義的、含有有效事務名稱的變量的名稱。必須用 char、varchar、nchar 或 nvarchar 資料類型聲明變量。如果傳遞給該變量的字元多于 32 個,則僅使用前面的 32 個字元;其餘的字元将被截斷。
- WITH MARK [ ' description ' ]
-
指定在日志中标記事務。description 是描述該标記的字元串。如果 description 是 Unicode 字元串,那麼在将長于 255 個字元的值存儲到 msdb.dbo.logmarkhistory 表之前,先将其截斷為 255 個字元。如果 description 為非 Unicode 字元串,則長于 510 個字元的值将被截斷為 510 字元。
如果使用了 WITH MARK,則必須指定事務名。WITH MARK 允許将事務日志還原到命名标記。
備注
BEGIN TRANSACTION 代表一點,由連接配接引用的資料在該點邏輯和實體上都一緻的。如果遇上錯誤,在 BEGIN TRANSACTION 之後的所有資料改動都能進行復原,以将資料傳回到已知的一緻狀态。每個事務繼續執行直到它無誤地完成并且用 COMMIT TRANSACTION 對資料庫作永久的改動,或者遇上錯誤并且用 ROLLBACK TRANSACTION 語句擦除所有改動。
BEGIN TRANSACTION 為發出本語句的連接配接啟動一個本地事務。根據目前事務隔離級别的設定,為支援該連接配接所發出的 Transact-SQL 語句而擷取的許多資源被該事務鎖定,直到使用 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 語句完成該事務為止。長時間處于未完成狀态的事務會阻止其他使用者通路這些鎖定的資源,也會阻止日志截斷。
雖然 BEGIN TRANSACTION 啟動一個本地事務,但是在應用程式接下來執行一個必須記錄的操作(如執行 INSERT、UPDATE 或 DELETE 語句)之前,它并不被記錄在事務日志中。應用程式能執行一些操作,例如為了保護 SELECT 語句的事務隔離級别而擷取鎖,但是直到應用程式執行一個修改操作後日志中才有記錄。
在一系列嵌套的事務中用一個事務名給多個事務命名對該事務沒有什麼影響。系統僅登記第一個(最外部的)事務名。復原到其他任何名稱(有效的儲存點名除外)都會産生錯誤。事實上,復原之前執行的任何語句都不會在錯誤發生時復原。這些語句僅當外層的事務復原時才會進行復原。
如果在語句送出或復原之前執行了如下操作,由 BEGIN TRANSACTION 語句啟動的本地事務将更新為分布式事務:
- 執行一個引用連結伺服器上的遠端表的 INSERT、DELETE 或 UPDATE 語句。如果用于通路連結伺服器的 OLE DB 通路接口不支援 ITransactionJoin 接口,則 INSERT、UPDATE 或 DELETE 語句會失敗。
- 當啟用了 REMOTE_PROC_TRANSACTIONS 選項時,将調用遠端存儲過程。
SQL Server 的本地副本成為事務控制器并且使用 Microsoft 分布式事務處理協調器 (MS DTC) 來管理分布式事務。
使用 BEGIN DISTRIBUTED TRANSACTION 可以将事務作為分布式事務顯式執行。有關詳細資訊,請參閱BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)。
标記事務
WITH MARK 選項使事務名被置于事務日志中。将資料庫還原到早期狀态時,可使用标記事務代替日期和時間。有關詳細資訊,請參閱使用标記的事務(完全恢複模式)和 RESTORE (Transact-SQL)。
另外,若要将一組相關資料庫恢複到邏輯上一緻的狀态,必須使用事務日志标記。标記可由分布式事務置于相關資料庫的事務日志中。将這組相關資料庫恢複到這些标記将産生一組在事務上一緻的資料庫。在相關資料庫中放置标記需要特殊的過程。
隻有當資料庫由标記事務更新時,才在事務日志中放置标記。不修改資料的事務不被标記。
在已存在的未标記事務中可以嵌套 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;
嵌套事務時,嘗試标記一個已标記的事務将産生警告(非錯誤)消息:
"BEGIN TRAN T1 WITH MARK ...;"
"UPDATE table1 ...;"
"BEGIN TRAN M2 WITH MARK ...;"
“伺服器: 消息 3920,級别 16,狀态 1,第 3 行”
"WITH MARK option only applies to the first BEGIN TRAN WITH MARK."
"The option is ignored."
權限
要求具有 public 角色的成員身份。
示例
A. 命名事務
以下示例顯示如何命名事務。
複制代碼
DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'MyTransaction';
BEGIN TRANSACTION @TranName;
USE AdventureWorks;
DELETE FROM AdventureWorks.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION @TranName;
GO
B. 标記事務
以下示例顯示如何标記事務。将标記事務 CandidateDelete。
複制代碼
BEGIN TRANSACTION CandidateDelete
WITH MARK N'Deleting a Job Candidate';
GO
USE AdventureWorks;
GO
DELETE FROM AdventureWorks.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION CandidateDelete;
GO