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

MS SQL Server MSDTC 分散式交易失效完整排查與修復指南

     編輯:關於SqlServer

錯誤現象

執行跨伺服器分散式交易(Linked Server、OPENROWSET、分散式 UPDATE/DELETE)時,出現「伺服器 'XXX' 上的 MSDTC 不可用」或「MSDTC 交易管理器無法啟動」等錯誤。

核心排查步驟

1. 基礎連通性測試

-- 測試 RPC 通訊埠 (135) 是否開放
telnet <目標伺服器IP> 135

-- 下載 Microsoft 官方 DTCPing 工具進行深度診斷
-- 下載位址: https://www.microsoft.com/en-us/download/details.aspx?id=2819
-- 兩台機器皆需安裝,依 README 操作測試

2. 確認 MSDTC 服務狀態

  • 兩台伺服器均需啟用 Distributed Transaction Coordinator 服務
  • 服務啟動類型設為「自動」,登入身分建議使用「網路服務」
net stop msdtc
net start msdtc

3. MSDTC 安全性設定 (關鍵步驟)

  1. 開啟「元件服務」:comexp.msc 或 控制台 → 系統管理工具 → 元件服務
  2. 展開:元件服務 → 電腦 → 我的電腦 → 右鍵「內容」
  3. 切換至 MSDTC 索引標籤 → 點選「安全性設定」
  4. 勾選以下所有選項:
    • 網路 DTC 存取
    • 允許遠端用戶端
    • 允許遠端管理
    • 允許輸出/輸入交易
    • 啟用 XA 交易
    • 啟用 SNA LU 6.2 交易 (如使用大型主機整合)
  5. DTC 登入帳戶 必須設為:NT AUTHORITY\NetworkService
  6. 點選「確定」,系統會提示重新啟動 MSDTC 服務,選擇「是」

4. 防火牆與網路設定

  • 開放 TCP 135 (RPC Endpoint Mapper)
  • 開放動態 RPC 埠範圍(預設 1024-65535,建議限制範圍):
    netsh int ipv4 set dynamicport tcp start=49152 num=16384
  • 若有硬體防火牆,需同步開放上述埠
  • 確認兩台伺服器可互相 Ping 通,且 DNS/NetBIOS 名稱解析正常

5. 連結伺服器設定優化

-- 建議使用 MSDASQL (ODBC) 而非 SQLOLEDB (OLEDB) 作為 Provider
EXEC sp_addlinkedserver 
  @server = 'LINKED_DB',
  @srvproduct = '',
  @provider = 'MSDASQL',
  @datasrc = 'ODBC_DSN_Name';  -- 需預先建立系統 DSN

-- 關閉「遠端存取」選項若不需雙向查詢
EXEC sp_serveroption 'LINKED_DB', 'remote proc transaction promotion', false;

6. 網域與信任關係

  • 同一網域:預設信任,通常無額外設定
  • 跨網域/工作群組:需建立雙向信任關係,或在本地安全性原則中設定「網路存取:本地帳戶的共用與安全性模型」為「經典」
  • 工作群組環境:兩台機器建立相同用戶名/密碼的本地帳戶,並加入 Distributed COM Users 群組

7. 系統層級更新

  • Windows 2000 必須安裝 SP4
  • MDAC 升級至 2.8 版本以上
  • SQL Server 安裝最新 Service Pack (SP3a 以上) 及累積更新
  • 所有修補程式下載:Microsoft Download Center

常見錯誤代碼對照

錯誤代碼含義建議處理
0x8004D00AMSDTC 服務未啟動啟動服務、設為自動
0x8004D01E網路存取被拒檢查防火牆、MSDTC 安全性設定
0x8004D024交易管理器不可用重啟 MSDTC、檢查事件檢視器 System/Application 日誌
0x80004005未指定的錯誤通常為權限或網路問題,配合 DTCPing 診斷

驗證修復結果

-- 測試分散式交易
BEGIN DISTRIBUTED TRANSACTION
  UPDATE [LINKED_DB].db.dbo.table SET col = 1 WHERE id = 1
  UPDATE local_db.dbo.table SET col = 2 WHERE id = 1
COMMIT TRANSACTION

若成功提交無錯誤,即表示 MSDTC 已正常運作。

生產環境建議

  1. 定期監控 MSDTC 服務狀態,納入 Zabbix/Prometheus 監控項目
  2. 記錄 DTCPing 測試結果作為基準線
  3. 避免在高併發核心業務大量使用分散式交易,改用最終一致性模式(Saga、事件驅動、MQ 可靠訊息)
  4. 若必須使用,建議啟用 SET XACT_ABORT ON 確保交易原子性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved