BEGIN TRANSACTION (Transact-SQL)
適用於:Microsoft Fabric 中的 SQL ServerAzure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse AnalyticsPlatform System (PDW)Warehouse
標示明確本機交易的起點。 明確交易會以 BEGIN TRANSACTION 陳述式開頭,並以 COMMIT 或 ROLLBACK 陳述式結尾。
Syntax
--Applies to SQL Server and Azure SQL Database
BEGIN { TRAN | TRANSACTION }
[ { transaction_name | @tran_name_variable }
[ WITH MARK [ 'description' ] ]
]
[ ; ]
--Applies to Synapse Data Warehouse in Microsoft Fabric, Azure Synapse Analytics and Parallel Data Warehouse
BEGIN { TRAN | TRANSACTION }
[ ; ]
注意
若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔。
引數
transaction_name
適用於:SQL Server 2008 (10.0.x) 與更新版本,以及 Azure SQL Database
這是指派給交易的名稱。 transaction_name 必須符合識別碼的規則,但不允許超出 32 個字元的識別碼。 請只在巢狀 BEGIN...COMMIT 或 BEGIN...ROLLBACK 陳述式的最外一組使用交易名稱。 即使 SQL Server 執行個體不區分大小寫,transaction_name 還是一律會區分大小寫。
@tran_name_variable
適用於:SQL Server 2008 (10.0.x) 與更新版本,以及 Azure SQL Database
這是包含有效交易名稱之使用者定義變數的名稱。 這個變數必須用 char、varchar、nchar 或 nvarchar 資料類型來宣告。 如果有 32 個以上的字元傳給變數,只會使用前 32 個字元,其餘字元會截斷。
WITH MARK [ 'description' ]
適用於:SQL Server 2008 (10.0.x) 與更新版本,以及 Azure SQL Database
指定在記錄中標示交易。 description 是說明標記的字串。 系統會先將超出 128 個字元的 description 截斷為 128 個字元,才會將它儲存於 msdb.dbo.logmarkhistory 資料表。
如果使用 WITH MARK,必須指定交易名稱。 WITH MARK 可讓您將交易記錄還原到具名標記。
一般備註
BEGIN TRANSACTION 會遞增 @@TRANCOUNT,遞增量是 1。
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 選項設為 ON 時,呼叫遠端預存程序。
SQL Server 的本機複本會成為交易控制器,且會使用 Microsoft Distributed Transaction Coordinator (MS DTC) 來管理分散式交易。
您可以利用 BEGIN DISTRIBUTED TRANSACTION,將交易明確當做分散式交易來執行。 如需詳細資訊,請參閱 BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)。
當 SET IMPLICIT_TRANSACTIONS 設定為 ON 時,BEGIN TRANSACTION 陳述式會建立兩筆巢狀交易。 如需詳細資訊,請參閱 SET IMPLICIT_TRANSACTIONS (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 ...;"
"Server: Msg 3920, Level 16, State 1, Line 3"
"WITH MARK 選項只可套用至第一個 BEGIN TRAN WITH MARK。"
"已忽略選項。"
權限
需要 public 角色中的成員資格。
範例
A. 使用明確交易
適用於:SQL Server 2008 (10.0.x) 與更新版本、Azure SQL Database、Azure Synapse Analytics,以及 Parallel Data Warehouse
這個範例會使用 AdventureWorks。
BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT;
B. 復原交易
適用於:SQL Server 2008 (10.0.x) 與更新版本、Azure SQL Database、Azure Synapse Analytics,以及 Parallel Data Warehouse
下列範例示範復原交易的效果。 在此範例中,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 Database
下列範例顯示如何命名交易。
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 Database
下列範例顯示如何標示交易。 已標示交易 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
另請參閱
BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL)
COMMIT WORK (Transact-SQL)
ROLLBACK TRANSACTION (Transact-SQL)
ROLLBACK WORK (Transact-SQL)
SAVE TRANSACTION (Transact-SQL)
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應