BEGIN TRANSACTION (Transact-SQL)
適用於:Microsoft Fabric 中的 SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) 倉儲
標示明確本機交易的起點。 明確交易會以 BEGIN TRANSACTION
語句開頭,並以 或 ROLLBACK
語句結尾COMMIT
。
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 }
[ ; ]
引數
transaction_name
適用於:SQL Server 2008 (10.0.x) 和更新版本、Azure SQL 資料庫 和 Azure SQL 受控執行個體
指派給交易的名稱。 transaction_name必須符合標識符的規則,但不允許超過 32 個字元的標識碼。 只在最外層的巢狀 BEGIN...COMMIT
或 BEGIN...ROLLBACK
語句上使用交易名稱。 transaction_name一律區分大小寫,即使 SQL Server 實例不區分大小寫也一樣。
@tran_name_variable
適用於:SQL Server 2008 (10.0.x) 和更新版本、Azure SQL 資料庫 和 Azure SQL 受控執行個體
包含有效交易名稱的使用者定義變數名稱。 這個變數必須用 char、varchar、nchar 或 nvarchar 資料類型來宣告。 如果傳遞超過 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
以 @@TRANCOUNT
1
遞增。
BEGIN TRANSACTION
表示連接所參考數據的邏輯和實體一致點。 如果發生錯誤,可以在 之後 BEGIN TRANSACTION
進行的所有數據修改復原,以將數據傳回這個已知的一致性狀態。 每個交易都會持續到它完成且沒有錯誤,併 COMMIT TRANSACTION
發出來使修改成為資料庫的永久部分,或遇到錯誤,而且所有修改都會用 ROLLBACK TRANSACTION
語句清除。
BEGIN TRANSACTION
啟動發出語句之連接的本機交易。 根據目前的交易隔離等級設定,為了支援連線發出的 Transact-SQL 語句所取得的許多資源會由交易鎖定,直到使用 或 ROLLBACK TRANSACTION
語句完成COMMIT TRANSACTION
為止。 交易長時間未完成會使其他使用者無法存取這些鎖定的資源,也會使記錄無法截斷。
雖然 BEGIN TRANSACTION
會啟動本機交易,但在應用程式接著執行必須在記錄檔中記錄的動作,例如執行 INSERT
、 UPDATE
或 DELETE
語句,否則不會記錄在事務歷史記錄中。 應用程式可以執行動作,例如取得鎖定來保護語句的交易 SELECT
隔離等級,但在應用程式執行修改動作之前,記錄檔中不會記錄任何專案。
利用交易名稱在一系列巢狀交易中命名多項交易對交易的影響不大。 系統只會登錄第一個 (最外層) 交易名稱。 回復任何其他名稱 (不是有效的儲存點名稱) 都會產生錯誤。 事實上在發生這個錯誤時,並不會回復在回復之前所執行的任何陳述式。 只有當外部交易回復時,才會回復陳述式。
如果在認可或回復語句之前執行下列動作,語句所 BEGIN TRANSACTION
啟動的本機交易會呈報至分散式交易:
執行
INSERT
參考連結伺服器上遠程數據表的、DELETE
或UPDATE
語句。INSERT
如果用來存取連結伺服器的 OLE DB 提供者不支援ITransactionJoin
介面,則、UPDATE
或DELETE
語句會失敗。當 選項設定
ON
為 時REMOTE_PROC_TRANSACTIONS
,會呼叫遠程預存程式。
SQL Server 的本機複本會成為交易控制器,且會使用 Microsoft Distributed Transaction Coordinator (MS DTC) 來管理分散式交易。
您可以使用 明確執行交易做為分散式交易 BEGIN DISTRIBUTED TRANSACTION
。 如需詳細資訊,請參閱 BEGIN DISTRIBUTED TRANSACTION。
當 設定為 ON
時SET 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
或 AdventureWorksDW2022
範例資料庫,從 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