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

SQL Server 分散式交易 (MSDTC) 疑難排解完整指南

     編輯:關於SqlServer

錯誤現象

Msg 7391, Level 16, State 2
The operation could not be performed because OLE DB provider "SQLNCLI" 
for linked server "SERVER_B" was unable to begin a distributed transaction.

-- SQL 2000
OLE DB provider 'SQLOLEDB' unable to begin distributed transaction.
[OLE/DB Provider returned message: New transaction cannot enlist in the specified transaction coordinator.]

MSDTC 架構基礎

  • SQL Server 資料庫引擎透過連結伺服器名稱/IP 存取遠端
  • DTC 服務同樣透過名稱/IP 連線協調交易
  • 雙方必須雙向解析名稱/IP 並通訊

六大解決步驟

1. 雙向啟動 MSDTC 服務

services.msc → Distributed Transaction Coordinator → 啟動類型:自動 → 啟動

兩台伺服器皆需執行。

2. 開放 RPC 通訊埠 (135 + 動態範圍)

  • DTC 依賴 RPC (埠 135) 進行端點對應
  • 實際資料傳輸使用動態高位埠 (預設 1024-65535)
  • 防火牆必須開放 135 + 動態範圍,或限制 DTC 埠範圍:
註冊表:HKEY_LOCAL_MACHINE\Software\Microsoft\Rpc\Internet
Ports = 5000-5020 (自訂範圍)
PortsInternetAvailable = Y
UseInternetPorts = Y

測試:telnet 135、PortQry、Advanced Port Scanner。

3. 避免 Loopback(環回)查詢

連結伺服器查詢中不可包含回查發起端伺服器的操作。
錯誤範例:Server A 發起分散式交易 → 查詢 Server B 連結伺服器視圖 → 視圖 JOIN Server A 表格。
解決:重寫查詢邏輯,或在應用層協調單一交易。

4. 交易前設定 SET XACT_ABORT ON

SET XACT_ABORT ON
BEGIN DISTRIBUTED TRANSACTION
    UPDATE Server_A.DB.dbo.Table SET ...
    INSERT Server_B.DB.dbo.Table ...
COMMIT TRANSACTION

強制發生錯誤時整個交易回滾,避免部分認交易導致 DTC 協調失敗。
所有分散式交易必加。

5. MSDTC 安全性設定 (關鍵)

組件服務 → 我的電腦 → 右鍵內容 → MSDTC 標籤 → 安全性設定:

選項設定說明
網路 DTC 存取☑ 啟用允許遠端協調
允許遠端用戶端☑ 啟用客戶端發起交易
允許遠端管理☑ 啟用遠端管理 DTC
允許輸入☑ 啟用接受遠端交易
允許輸出☑ 啟用發起遠端交易
不需要驗證☑ 啟用工作群組環境必選;網域可用「相互驗證」
DTC 登入帳戶NT AUTHORITY\NetworkService預設帳戶,勿改

設定完成需重啟 MSDTC 服務生效。

6. 連結伺服器名稱解析一致性

-- 方式 1:產品名稱 SQL Server
EXEC sp_addlinkedserver @server = 'ServerB', @srvproduct = 'SQL Server'
-- @server 必須為實際伺服器名稱或 IP

-- 方式 2:指定提供者
EXEC sp_addlinkedserver 
    @server = 'LinkName', 
    @provider = 'SQLNCLI', 
    @datasrc = 'ActualServerNameOrIP'
-- @datasrc 為實際目標

核心原則:SQL 引擎用名稱/IP 連線,DTC 也用名稱/IP 連線 → 雙方解析結果必須一致。
建議:統一用 FQDN 或 IP,在 hosts 檔或 DNS 確保雙向解析。

診斷工具與指令

  • DTCPing.exe:Microsoft 官方 DTC 連線測試工具(雙向)
  • DTCTester.exe:圖形化測試工具
  • netsh firewall show state / Get-NetFirewallRule:檢查防火牆規則
  • 事件檢視器 → Applications and Services Logs → Microsoft → MSDTC

常見陷阱

現象原因解決
單向通、單向不通防火牆非對稱規則雙向開放 135 + 動態埠
網域環境驗證失敗SPN 未註冊、信任關係斷裂檢查 SPN、網域信任、Kerberos 委派
啟用「不需要驗證」仍失敗登入帳戶非 NetworkService改回 NetworkService 重啟 DTC
連結伺服器用 IP、DTC 用名稱名稱解析不一致統一用 IP 或同步 hosts/DNS

現代替代方案

  • 可用性群組:同步複寫、自動容錯移轉、無需分散式交易
  • 服務匯流排 / 訊息佇列:最終一致性、Saga 模式、解耦服務
  • 彈性交易 (Elastic Transactions):Azure SQL Database 跨資料庫交易
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved