BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
指定啟動 Microsoft 分散式交易協調器 (MS DTC) 所管理的 Transact-SQL 分散式交易。
適用於:SQL Server (SQL Server 2008 至目前版本)。 |
語法
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 本機執行個體和遠端伺服器之執行個體的 AdventureWorks2012 資料庫中,刪除一個候選項。 本機和遠端資料庫都會認可或回復交易。
注意
除非 MS DTC 目前安裝在執行 Database Engine 執行個體的電腦中,否則,這個範例會產生錯誤訊息。如需有關安裝 MS DTC 的詳細資訊,請參閱 Microsoft 分散式交易協調器文件集。
USE AdventureWorks2012;
GO
BEGIN DISTRIBUTED TRANSACTION;
-- Delete candidate from local instance.
DELETE AdventureWorks2012.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
-- Delete candidate from remote instance.
DELETE RemoteServer.AdventureWorks2012.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION;
GO
請參閱
參考
BEGIN TRANSACTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL)