BEGIN TRANSACTION (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsMicrosoft Fabric 中的倉儲Microsoft Fabric 中的 SQL 資料庫

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

Transact-SQL 語法慣例

Syntax

SQL Server、Azure SQL Database、Azure SQL 受控執行個體, SQL database in Microsoft Fabric 的語法。

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

Fabric Data Warehouse和Azure Synapse Analytics的語法。

BEGIN { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

適用於:SQL Server 2008(10.0.x)及更新版本、Azure SQL 資料庫、Azure SQL 管理實例、Microsoft Fabric 中的 SQL 資料庫。

指派給交易的名稱。 transaction_name必須符合標識符的規則,但不允許超過 32 個字元的標識碼。 只在最 BEGIN...COMMIT 外層的 or BEGIN...ROLLBACK 對帳單上使用交易名稱。 transaction_name 總是大小寫區分,即使資料庫引擎實例本身不區分大小寫。

@tran_name_variable

適用於:SQL Server 2008(10.0.x)及更新版本、Azure SQL 資料庫、Azure SQL 管理實例、Microsoft Fabric 中的 SQL 資料庫。

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

與馬克 [ 「描述」 ]

適用於:SQL Server 2008(10.0.x)及更新版本、Azure SQL 資料庫、Azure SQL 管理實例、Microsoft Fabric 中的 SQL 資料庫。

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

如果使用 WITH MARK ,則必須指定交易名稱。 WITH MARK 允許將交易日誌還原到標記所識別的點。

Remarks

BEGIN TRANSACTION 以 @@TRANCOUNT1遞增。

BEGIN TRANSACTION 代表會話所參考資料具有一定一致性狀態的點。 之後所做的 BEGIN TRANSACTION 所有資料修改都可以回滾,讓資料回到這個已知的一致性狀態。 每個交易持續到 COMMIT TRANSACTION 被發出,將修改永久納入資料庫,或以 ROLLBACK TRANSACTION 聲明刪除所有修改為止。

若發生交易中止錯誤,或任何執行時錯誤且 XACT_ABORT 會話選項設定為 ON,交易可自動回滾。 如需詳細資訊,請參閱SET XACT_ABORT。

BEGIN TRANSACTION 啟動發出該語句的會話的本地交易。 根據目前的交易隔離層級設定,交易會鎖定以支援會話所發出 Transact-SQL 語句的資源,直到以 a COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 陳述句完成。 長期未完成的交易可阻止其他會話存取這些鎖定資源,也能防止交易日誌截斷及版本儲存清理。

雖然 BEGIN TRANSACTION 會啟動本機交易,但在應用程式接著執行必須在記錄檔中記錄的動作,例如執行 INSERT、 UPDATE或 DELETE 語句,否則不會記錄在事務歷史記錄中。 一旦交易啟動,資料庫引擎可以執行如取得鎖以保護文件中交易隔離層 SELECT 級的行動,但在應用程式執行修改動作前,交易日誌中不會記錄任何內容。

發行 BEGIN TRANSACTION後,你可以再次發行 BEGIN TRANSACTION ,開始一個或多個內部交易。 即使你可以為內部交易指定 transaction_name ,系統中只有第一個(最外層)交易名稱被註冊。 回滾到任何其他名稱(非有效儲存點名稱)會產生錯誤,但不會回滾任何語句。 只有當外部交易回復時,才會回復陳述式。

如果在陳述句被提交或回滾前執行以下動作,則由語句發起 BEGIN TRANSACTION 的本地交易將升級為分散式交易:

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

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

本地的資料庫引擎實例成為交易控制器,並使用 Microsoft 分散式交易協調器(MS DTC)來管理分散式交易。

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

當 SET IMPLICIT_TRANSACTIONS 設為 ON時,一個 BEGIN TRANSACTION 陳述句會產生一個外部交易和一個內部交易,並設 @@TRANCOUNT 為 2。 如需詳細資訊,請參閱SET IMPLICIT_TRANSACTIONS。

備註

資料庫引擎不支援獨立且可管理的巢狀交易。 內部交易的提交會 @@TRANCOUNT 遞減,但不會有其他影響。 內層交易的回滾總是會回滾外部交易,除非存在儲存 點 且語句中 ROLLBACK 明確指定。

已標記的交易

這個 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 column1 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

本文的程式碼範例使用AdventureWorks2025了 、 AdventureWorksDW2025或AdventureWorksLT2025範例資料庫,你可以從 Azure Data SQL 範例庫 GitHub 下載。

A. 使用明確交易

適用於:SQL Server 2008(10.0.x)及更新版本、Azure SQL Database、Azure SQL 受控執行個體、Microsoft Fabric 中的 SQL 資料庫,以及 Azure Synapse Analytics

BEGIN TRANSACTION;

DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;

COMMIT TRANSACTION;

B. 回復交易

適用於:SQL Server 2008(10.0.x)及更新版本、Azure SQL Database、Azure SQL 受控執行個體、Microsoft Fabric 中的 SQL 資料庫,以及 Azure Synapse Analytics

下列範例示範復原交易的效果。 在此範例中 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 管理實例、Microsoft Fabric 中的 SQL 資料庫

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

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

BEGIN TRANSACTION @TranName;

DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;

COMMIT TRANSACTION @TranName;

D. 標示交易

適用於:SQL Server 2008(10.0.x)及以後版本、Azure SQL 資料庫、Azure SQL 管理實例、Microsoft Fabric 中的 SQL 資料庫

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

BEGIN TRANSACTION CandidateDelete
    WITH MARK N'Deleting a Job Candidate';

DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;

COMMIT TRANSACTION CandidateDelete;