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

SQL Server 分散式事務 (MSDTC) 失敗完整排查指南:六大核心解決方案

     編輯:SQL Server 2005

錯誤現象

SQL 2005:Msg 7391, Level 16, State 2: 無法啟動分散式事務,OLE DB 提供者 "SQLNCLI" 回傳錯誤。
SQL 2000:OLE DB 提供者 'SQLOLEDB' 無法啟動分散式事務。新事務不能登記到指定的事務處理器中。 (0x8004d00a)

六大核心解決方案

1. 雙向啟動 MSDTC 服務

參與分散式事務的兩台伺服器必須都啟動 Distributed Transaction Coordinator (MSDTC) 服務 (services.msc → 設為「自動」並啟動)。

2. 開放雙向 TCP 135 端口 (RPC 端點對應器)

MSDTC 依賴 RPC (Remote Procedure Call),RPC 使用 TCP 135 協商動態端口。
驗證:telnet <對方IP> 135 或用掃描工具確認 135 通。防火牆需放行雙向 135 及動態端口範圍 (可透過註冊表限制 RPC 動態端口範圍再開放)。

3. 避免 Loopback (環回) 查詢

發起事務的伺服器上,連結伺服器的查詢/視圖/預存程序 不得包含查詢發起端自身的物件。這稱為 Loopback,MSDTC 不支援,會導致啟動失敗。

4. 事務開啟前設定 SET XACT_ABORT ON

對大多數 OLE DB 提供者 (含 SQL Server),隱式/顯式事務中若有資料修改,必須 設 SET XACT_ABORT ON,否則分散式事務無法登記。
唯一例外:提供者支援巢狀事務時 (SQL Server 不支援)。

5. MSDTC 安全性配置 (關鍵)

「管理工具」→「元件服務」→「電腦」→「我的電腦」右鍵→屬性→【MSDTC】頁籤→【安全性配置】:

  • ☑ 網路 DTC 存取
  • ☑ 允許遠端用戶端 / ☑ 允許遠端管理
  • 交易管理員通訊:☑ 允許輸入 / ☑ 允許輸出 / ☑ 不需要驗證 (No Authentication Required)
  • DTC 登入帳戶:NT AUTHORITY\NetworkService

配置完成後會自動重啟 MSDTC 服務。

6. 連結伺服器名稱解析正確性

建立連結伺服器兩種方式,需確保引擎與 DTC 皆能解析:

  • 方式 1 (產品名稱 = SQL Server):EXEC sp_addlinkedserver @server='LinkSrv', @srvproduct=N'SQL Server'; → @server 必須是可解析的遠端伺服器名或 IP。
  • 方式 2 (提供者 = SQLNCLI):EXEC sp_addlinkedserver @server='LinkSrv', @provider='SQLNCLI', @datasrc='RemoteSrv'; → @datasrc 為實際遠端伺服器名/IP。

驗證:在發起端 ping RemoteSrv、nslookup RemoteSrv、telnet RemoteSrv 1433 皆通。

快速檢查清單

項目驗證命令/位置預期結果
MSDTC 服務services.mscRunning, Auto
TCP 135telnet IP 135連線成功
Loopback檢查連結伺服器物件定義無查詢本端物件
XACT_ABORT事務開頭SET XACT_ABORT ON
MSDTC 安全性元件服務 → 我的電腦 → MSDTC → 安全性配置上述 5 項全勾選
名稱解析ping / nslookup / telnet 1433全部通

常見誤區

  • 只在一方開防火牆 135 → 必須雙向。
  • 以為 sp_configure 'remote proc trans', 1 就夠了 → 那是舊選項,核心在 MSDTC 設定。
  • 連結伺服器用 IP,但 DTC 依賴 NetBIOS/DNS 名稱 → 建議雙方 hosts 檔映射或 DNS 正確解析名稱。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved