BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)

指定啟動 Microsoft 分散式交易協調器 (MS DTC) 所管理的 Transact-SQL 分散式交易。

主題連結圖示Transact-SQL 語法慣例

語法

BEGIN DISTRIBUTED { TRAN | TRANSACTION } 
     [ transaction_name | @tran_name_variable ] 
[ ; ]

引數

  • transaction_name
    這是在 MS DTC 公用程式內,用來追蹤分散式交易的使用者自訂交易名稱。transaction_name 必須符合識別碼的規則,且必須 <= 32 個字元。

  • @tran\_name\_variable
    這是一個使用者自訂變數的名稱,變數中包含在 MS DTC 公用程式內,用來追蹤分散式交易的交易名稱。這個變數必須用 char、varchar、nchar 或 nvarchar 資料類型來宣告。

備註

執行 BEGIN DISTRIBUTED TRANSACTION 陳述式的 SQL Server Database Engine 執行個體是交易發起者,它會控制交易的完成。當發出工作階段的後續 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 陳述式時,負責控制的執行個體會要求 MS DTC 跨越所涉及的所有執行個體來管理分散式交易的完成。

交易層級快照集隔離不支援分散式交易。如需詳細資訊,請參閱<使用資料列版本控制式的隔離等級>。

在已編列到分散式交易的工作階段執行參考連結伺服器的分散式查詢,是將 Database Engine 遠端執行個體編列到分散式交易的主要方式。

例如,如果對 ServerA 發出 BEGIN DISTRIBUTED TRANSACTION,工作階段會在 ServerB 上呼叫一個預存程序,在 ServerC 上呼叫另一個預存程序。ServerC 的預存程序會針對 ServerD 來執行分散式查詢,然後四部電腦才會涉及分散式交易。ServerA 的 Database Engine 執行個體是交易的起始控制執行個體。

Transact-SQL 分散式交易所涉及的工作階段不會取得它們可傳給另一個工作階段的交易物件,以便將它明確加入分散式交易。遠端伺服器編列到交易的唯一方法,是作為分散式查詢或遠端預存程序呼叫的目標。

當在本機交易中執行分散式查詢時,如果目標 ODE DB 資料來源支援 ITransactionLocal,交易會自動升級為分散式交易。如果目標 OLE DB 資料來源不支援 ITransactionLocal,分散式查詢便只允許唯讀作業。

已編列到分散式交易的工作階段會執行參考遠端伺服器的遠端預存程序呼叫。

sp_configure remote proc trans 選項會控制在本機交易內對遠端預存程序的呼叫,是否會使本機交易自動升級為 MS DTC 所管理的分散式交易。連接層級 SET 選項 REMOTE_PROC_TRANSACTIONS 可用來覆寫 sp_configure remote proc trans 所建立的執行個體預設值。當這個選項設為 ON 時,遠端預存程序呼叫會使本機交易升級為分散式交易。建立 MS DTC 交易的連接會成為交易的發起者。COMMIT TRANSACTION 會起始一項 MS DTC 協調認可。如果 sp_configure remote proc trans 選項是 ON,本機交易中的遠端預存程序會成為分散式交易的一部份,而自動受到保護,您不需要重新撰寫應用程式,明確發出 BEGIN DISTRIBUTED TRANSACTION 來取代 BEGIN TRANSACTION。

如需有關分散式交易環境和處理序的詳細資訊,請參閱 Microsoft 分散式交易協調器文件集。

權限

需要 public 角色中的成員資格。

範例

這個範例會從 Database Engine 本機執行個體和遠端伺服器之執行個體的 AdventureWorks 資料庫中,刪除一個候選項。本機和遠端資料庫都會認可或回復交易。

[!附註]

除非 MS DTC 目前安裝在執行 Database Engine 執行個體的電腦中,否則,這個範例會產生錯誤訊息。如需有關安裝 MS DTC 的詳細資訊,請參閱 Microsoft 分散式交易協調器文件集。

USE AdventureWorks;
GO
BEGIN DISTRIBUTED TRANSACTION;
-- Delete candidate from local instance.
DELETE AdventureWorks.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
-- Delete candidate from remote instance.
DELETE RemoteServer.AdventureWorks.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
COMMIT TRANSACTION;
GO