Transact-SQL 分散式交易

以 Transact-SQL 來啟動的分散式交易具有相單簡單的結構:

  1. Transact-SQL 指令碼或應用程式連接執行 Transact-SQL 陳述式,啟動分散式交易。

  2. 執行陳述式的 SQL Server Database Engine 執行個體變成交易中的控制伺服器。

  3. 再由指令碼或應用程式對連結的伺服器執行分散式查詢,或對遠端伺服器執行遠端預存程序。

  4. 進行分散式查詢及遠端程序呼叫時,控制伺服器會自動呼叫 Microsoft 分散式交易協調器 (MS DTC),來編列分散式交易中之連結的伺服器與遠端伺服器。

  5. 當指令碼或應用程式發出 COMMIT 或 ROLLBACK 陳述式時,SQL Server 的控制執行個體會呼叫 MS DTC 來管理兩階段認可 (Two Phase Commit) 過程,或通知連結及遠端伺服器將自己的交易復原。

必要的 Transact-SQL 陳述式

控制分散式交易的 Transact-SQL 陳述式很少,因為大部份的工作是由 SQL Server Database Engine 和 MS DTC 內部來完成。在 Transact-SQL 指令碼或應用程式中必要的 Transact-SQL 陳述式是要:

  • 啟動分散式交易。

  • 對連結的伺服器執行分散式查詢,或對遠端伺服器執行遠端程序呼叫。

  • 呼叫標準的 Transact-SQL COMMIT TRANSACTION、COMMIT WORK、ROLLBACK TRANSACTION 或 ROLLBACK WORK 陳述式來完成交易。

    對於任何 Transact-SQL 分散式交易,處理 Transact-SQL 指令碼或連接的 Database Engine 執行個體會自動呼叫 MS DTC 來協調交易的認可或回復。

啟動分散式交易

您可以採用下列方式在 Transact-SQL 中啟動分散式交易:

  • 使用 BEGIN DISTRIBUTED TRANSACTION 陳述式來啟動外顯分散式交易。

    您也可以對連結的伺服器執行分散式查詢。由已連接的 Database Engine 執行個體呼叫 MS DTC,來管理連結的伺服器之下的分散式交易。您也可以呼叫位於遠端 Database Engine 執行個體的遠端預存程序作為分散式交易的一部份。

  • 位於本機交易時,執行分散式查詢。

    OLE DB 資料來源如果支援 ITransactionJoin 介面,即使查詢是唯讀查詢,交易亦會升級為分散式交易。如果資料來源不支援 ITransactionJoin,便僅允許唯讀的陳述式。

  • 如果 SET REMOTE_PROC_TRANSACTIONS ON 已經執行,且本機交易呼叫位於另一個 Database Engine 執行個體的預存程序,本機交易便升級為分散式交易。

    Database Engine 會使用 MS DTC 來和遠端伺服器協調交易。REMOTE_PROC_TRANSACTIONS 如果設定為 OFF,便在本機交易的範圍外,執行對遠端預存程序的呼叫。本機交易如果回復,則遠端程序所完成的工作不會回復。遠端預存程序所完成的工作會在程序完成時被認可,而不是在認可本機交易時。

REMOTE_PROC_TRANSACTIONS 選項為相容性選項,只會影響使用 sp_addserver 定義之遠端伺服器所進行的遠端預存程序呼叫。針對使用 sp_addlinkedserver 定義之連結的伺服器上的預存程序執行分散式查詢時,不會套用此選項。如需有關分散式查詢的詳細資訊,請參閱<分散式查詢>。