共用方式為


BEGIN TRANSACTION (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics分析平台系統(PDW)Microsoft Fabric 中的倉庫Microsoft Fabric 中的 SQL 資料庫

標示明確本機交易的起點。 明確交易會以 BEGIN TRANSACTION 語句開頭,並以 或 COMMIT 語句結尾ROLLBACK

Transact-SQL 語法慣例

Syntax

SQL Server、Azure SQL 資料庫、Fabric SQL 資料庫和 Azure SQL 受控執行個體的語法。

BEGIN { TRAN | TRANSACTION }
    [ { transaction_name | @tran_name_variable }
      [ WITH MARK [ 'description' ] ]
    ]
[ ; ]

Fabric Data Warehouse、Azure Synapse Analytics 和分析平台系統 (PDW) 的語法。

BEGIN { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

適用於: SQL Server 2008 (10.0.x) 和更新版本、Azure SQL 資料庫、Fabric SQL 資料庫和 Azure SQL 受控執行個體

指派給交易的名稱。 transaction_name必須符合標識符的規則,但不允許超過 32 個字元的標識碼。 只在最外層的巢狀 BEGIN...COMMITBEGIN...ROLLBACK 語句上使用交易名稱。 transaction_name一律區分大小寫,即使 SQL Server 實例不區分大小寫也一樣。

@tran_name_variable

適用於: SQL Server 2008 (10.0.x) 和更新版本、Azure SQL 資料庫、Fabric SQL 資料庫和 Azure SQL 受控執行個體

包含有效交易名稱的使用者定義變數名稱。 這個變數必須用 charvarcharncharnvarchar 資料類型來宣告。 如果傳遞超過 32 個字元給變數,則只會使用前 32 個字元。 其餘字元會被截斷。

與馬克 [ 「描述」 ]

適用於: SQL Server 2008 (10.0.x) 和更新版本、Azure SQL 資料庫、Fabric SQL 資料庫和 Azure SQL 受控執行個體

指定在記錄中標示交易。 description 是說明標記的字串。 會截斷為 128 個字元。

如果使用 WITH MARK ,則必須指定交易名稱。 WITH MARK 允許將事務歷史記錄還原至具名標記。

Remarks

BEGIN TRANSACTION@@TRANCOUNT1遞增。

BEGIN TRANSACTION 表示連接所參考數據的邏輯和實體一致點。 如果發生錯誤,可以在 之後 BEGIN TRANSACTION 進行的所有數據修改復原,以將數據傳回這個已知的一致性狀態。 每個交易都會持續到它完成且沒有錯誤,併 COMMIT TRANSACTION 發出來使修改成為資料庫的永久部分,或遇到錯誤,而且所有修改都會用 ROLLBACK TRANSACTION 語句清除。

BEGIN TRANSACTION 啟動發出語句之連接的本機交易。 根據目前的交易隔離等級設定,為了支援連線發出的 Transact-SQL 語句所取得的許多資源會由交易鎖定,直到使用 或 COMMIT TRANSACTION 語句完成ROLLBACK TRANSACTION為止。 交易長時間未完成會使其他使用者無法存取這些鎖定的資源,也會使記錄無法截斷。

雖然 BEGIN TRANSACTION 會啟動本機交易,但在應用程式接著執行必須在記錄檔中記錄的動作,例如執行 INSERTUPDATEDELETE 語句,否則不會記錄在事務歷史記錄中。 應用程式可以執行動作,例如取得鎖定來保護語句的交易 SELECT 隔離等級,但在應用程式執行修改動作之前,記錄檔中不會記錄任何專案。

利用交易名稱在一系列巢狀交易中命名多項交易對交易的影響不大。 系統只會登錄第一個 (最外層) 交易名稱。 回復任何其他名稱 (不是有效的儲存點名稱) 都會產生錯誤。 事實上在發生這個錯誤時,並不會回復在回復之前所執行的任何陳述式。 只有當外部交易回復時,才會回復陳述式。

如果在認可或回復語句之前執行下列動作,語句所 BEGIN TRANSACTION 啟動的本機交易會呈報至分散式交易:

  • 執行 INSERT參考連結伺服器上遠程數據表的、 DELETEUPDATE 語句。 INSERT如果用來存取連結伺服器的 OLE DB 提供者不支援 UPDATE 介面,則、 DELETEITransactionJoin 語句會失敗。

  • 當 選項設定REMOTE_PROC_TRANSACTIONS為 時ON,會呼叫遠程預存程式。

SQL Server 的本機複本會成為交易控制器,且會使用 Microsoft Distributed Transaction Coordinator (MS DTC) 來管理分散式交易。

您可以使用 明確執行交易做為分散式交易 BEGIN DISTRIBUTED TRANSACTION。 如需詳細資訊,請參閱 BEGIN DISTRIBUTED TRANSACTION

當 設定為 SET IMPLICIT_TRANSACTIONSON,語句會建立兩個BEGIN TRANSACTION巢狀交易。 如需詳細資訊,請參閱 SET IMPLICIT_TRANSACTIONS

已標記的交易

選項 WITH MARK 會使交易名稱放在事務歷史記錄中。 當您將資料庫還原至先前的狀態時,可以使用標示的交易來取代日期和時間。 如需詳細資訊,請參閱 使用標示的交易以一致的方式 復原相關資料庫和 RESTORE 語句

另外,如果您必須將一組相關資料庫復原到邏輯一致的狀態,交易記錄標示便是必要的。 分散式交易可以將標示放在這組相關資料庫的交易記錄中。 將這組相關資料庫復原到這些標示會產生一組交易一致的資料庫。 將標示放在相關資料庫中需要特殊程序。

只有當標示的交易更新資料庫時,才會將標示放在交易記錄中。 未修改數據的交易不會標示。

BEGIN TRANSACTION <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;

當您巢狀交易時,如果您嘗試標記已標示的交易,您會收到下列警告訊息:

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.

Permissions

需要 public 角色的成員資格。

Examples

本文中的程式代碼範例會使用 AdventureWorks2025AdventureWorksDW2025 範例資料庫,您可以從 Microsoft SQL Server 範例和社群專案 首頁下載。

A. 使用明確交易

適用於: SQL Server 2008 (10.0.x) 和更新版本、Azure SQL 資料庫、Fabric SQL 資料庫、Azure SQL 受控執行個體、Azure Synapse Analytics、分析平台系統 (PDW)

BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
COMMIT;

B. 復原交易

適用於: SQL Server 2008 (10.0.x) 和更新版本、Azure SQL 資料庫、Fabric SQL 資料庫、Azure SQL 受控執行個體、Azure Synapse Analytics、分析平台系統 (PDW)

下列範例示範復原交易的效果。 在此範例中 ROLLBACK ,語句會回復 INSERT 語句,但已建立的數據表仍然存在。

CREATE TABLE ValueTable (id INT);
BEGIN TRANSACTION;
    INSERT INTO ValueTable VALUES(1);
    INSERT INTO ValueTable VALUES(2);
ROLLBACK;

C. 為交易命名

適用於: SQL Server 2008 (10.0.x) 和更新版本、Azure SQL 資料庫、Fabric SQL 資料庫、Azure SQL 受控執行個體

下列範例顯示如何命名交易。

DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'MyTransaction';

BEGIN TRANSACTION @TranName;
USE AdventureWorks2022;
DELETE FROM AdventureWorks2022.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;

COMMIT TRANSACTION @TranName;
GO

D. 標示交易

適用於: SQL Server 2008 (10.0.x) 和更新版本、Azure SQL 資料庫、Fabric SQL 資料庫、Azure SQL 受控執行個體

下列範例顯示如何標示交易。 已標示交易 CandidateDelete

BEGIN TRANSACTION CandidateDelete
    WITH MARK N'Deleting a Job Candidate';
GO
USE AdventureWorks2022;
GO
DELETE FROM AdventureWorks2022.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION CandidateDelete;
GO