分散式交易 由 MSDTC (Microsoft Distributed Transaction Coordinator) 協調,確保多台 SQL Server 執行個體間的多項操作 **全成功或全失敗**。適用於:
✅ 跨伺服器資料同步
✅ 微服務資料庫一致性
✅ 異構資料庫協調(透過連結伺服器)
| 項目 | 檢查/設定 |
|---|---|
| 服務啟動 | 兩台伺服器 Distributed Transaction Coordinator 服務均為「執行中」且設為「自動」 |
| 網路通訊 | 雙向 ping 通、telnet <IP> 135 (RPC) 及動態連接埠範圍通 |
| 防火牆 | 允許 MSDTC 通訊(入站/出站規則、啟用「網路 DTC 存取」) |
| 安全性設定 | 元件服務 → 電腦 → 我的電腦 → Distributed Transaction Coordinator → 本地 DTC → 內容 → 安全性 → 勾選所有「網路 DTC 存取」、「允許遠端用戶端/管理」、「允許輸出/輸入」、「無驗證必要」 |
| 連結伺服器 | 已建立連結伺服器並測試連線成功 |
-- 於控制伺服器 (Server A) 發起
BEGIN DISTRIBUTED TRANSACTION;
-- 本地操作
DELETE FROM [LocalDB].[dbo].[SystemPara] WHERE [Name] = 'HDTPort';
-- 遠端操作 (四段式名稱:連結伺服器.資料庫.結構描述.資料表)
DELETE FROM [RemoteServer].[RemoteDB].[dbo].[SystemPara] WHERE [Name] = 'HDTPort';
-- 統一認可或回滾
COMMIT TRAN; -- 或 ROLLBACK TRAN;
GO
BEGIN DISTRIBUTED TRANSACTION 必須在**同一連線**下與後續操作、COMMIT/ROLLBACK 配對。LinkedServer.Database.Schema.Table),否則無法納入分散式交易範圍。
USE [GPOSDB];
GO
-- 驗證連結伺服器連通性
SELECT * FROM [WIN7U-20130414Z].[GPOSDB].dbo.[SystemPara] WHERE [Name] = 'HDTPort';
GO
BEGIN DISTRIBUTED TRANSACTION;
BEGIN TRY
-- 本地刪除
DELETE FROM [JOESERVER].[GPOSDB].[DBO].[SystemPara] WHERE [Name] = 'HDTPort';
-- 遠端刪除
DELETE FROM [WIN7U-20130414Z].[GPOSDB].[dbo].[SystemPara] WHERE [Name] = 'HDTPort';
COMMIT TRAN;
PRINT '分散式交易認可成功';
END TRY
BEGIN CATCH
ROLLBACK TRAN;
PRINT '分散式交易回滾: ' + ERROR_MESSAGE();
END CATCH
GO
| 問題 | 原因 | 解決 |
|---|---|---|
| 「交易管理員已停用」 | MSDTC 服務未啟動或防火牆阻擋 | 檢查服務、防火牆、網路 DTC 存取權限 |
| 「無法登入連結伺服器」 | 連結伺服器安全性對應錯誤 | 設定「建立此安全性內容」提供有效遠端登入 |
| 巢狀交易衝突 | 觸發器/預存程序中已有隱含交易 | 避免在觸發器使用分散式交易,改用非同步機制 |
| 效能嚴重下降 | 兩階段認可 (2PC) 鎖定資源時間長 | 縮短交易範圍、避免長時間跨伺服器交易、評估 Saga 模式替代 |
BEGIN DISTRIBUTED TRANSACTION 是 SQL Server 實現跨伺服器強一致性的原生機制,但**依賴 MSDTC、鎖定久、除錯難**。生產環境務必完成「服務、網路、防火牆、安全性」四項 MSDTC 設定驗證,並在交易範圍內**僅包含必要操作、避免使用者互動、設定逾時**。若業務可接受最終一致性,強烈建議評估非同步替代方案以降低系統耦合與風險。