首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 分散式交易實戰:BEGIN DISTRIBUTED TRANSACTION 跨伺服器資料一致性控制

     編輯:關於SqlServer

分散式交易核心概念

分散式交易 由 MSDTC (Microsoft Distributed Transaction Coordinator) 協調,確保多台 SQL Server 執行個體間的多項操作 **全成功或全失敗**。適用於:
✅ 跨伺服器資料同步
✅ 微服務資料庫一致性
✅ 異構資料庫協調(透過連結伺服器)

前置條件:MSDTC 必須正確設定

項目檢查/設定
服務啟動兩台伺服器 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),否則無法納入分散式交易範圍。
  • 控制伺服器 (發起端) 為交易管理者,協調所有參與節點的 Prepare/Commit 階段。

實戰範例:雙向同步刪除


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 模式替代

進階替代方案:現代架構下的選擇

  • Saga 模式 / 事件驅動:本地交易 + 訊息佇列補償,犧牲強一致性換取高可用與效能。
  • CDC + ETL:擷取變更非同步同步,適合報表/資料倉庫場景。
  • PolyBase / 連結伺服器查詢:僅需跨伺服器查詢而非寫入時,考慮唯讀存取。

結語

BEGIN DISTRIBUTED TRANSACTION 是 SQL Server 實現跨伺服器強一致性的原生機制,但**依賴 MSDTC、鎖定久、除錯難**。生產環境務必完成「服務、網路、防火牆、安全性」四項 MSDTC 設定驗證,並在交易範圍內**僅包含必要操作、避免使用者互動、設定逾時**。若業務可接受最終一致性,強烈建議評估非同步替代方案以降低系統耦合與風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved