Share via


BEGIN TRANSACTION (Transact-SQL)

適用於:Microsoft Fabric 中的 SQL ServerAzure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse AnalyticsAnalytics Platform System (PDW)Warehouse

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

Transact-SQL 語法慣例

Syntax

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

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

Microsoft Fabric、Azure Synapse Analytics 和分析平台系統 (PDW) 中 Synapse 數據倉儲的語法。

BEGIN { TRAN | TRANSACTION }
[ ; ]

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

引數

transaction_name

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

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

@tran_name_variable

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

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

WITH MARK [ 'description' ]

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

指定在記錄中標示交易。 description 是說明標記的字串。 在數據表中msdb.dbo.logmarkhistory儲存之前,超過 128 個字元的描述會截斷為 128 個字元。

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

備註

BEGIN TRANSACTION@@TRANCOUNT1遞增。

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

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

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

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

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

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

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

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

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

當 設定為 ONSET IMPLICIT_TRANSACTIONS,語句會建立兩個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.

權限

需要 public 角色的成員資格。

範例

本文 Transact-SQL 程式碼範例使用 AdventureWorks2022 範例資料庫,從 Microsoft SQL Server Samples 和 Community Projects (Microsoft SQL Server 範例和社群專案)首頁即可下載。

A. 使用明確交易

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

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

B. 復原交易

適用於:SQL Server 2008 (10.0.x) 和更新版本、Azure SQL 資料庫、Azure SQL 受控執行個體、Azure Synapse Analytics、Analytics Platform System (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 資料庫、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 資料庫、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