SQL 2005:Msg 7391, Level 16, State 2: 無法啟動分散式事務,OLE DB 提供者 "SQLNCLI" 回傳錯誤。
SQL 2000:OLE DB 提供者 'SQLOLEDB' 無法啟動分散式事務。新事務不能登記到指定的事務處理器中。 (0x8004d00a)
參與分散式事務的兩台伺服器必須都啟動 Distributed Transaction Coordinator (MSDTC) 服務 (services.msc → 設為「自動」並啟動)。
MSDTC 依賴 RPC (Remote Procedure Call),RPC 使用 TCP 135 協商動態端口。
驗證:telnet <對方IP> 135 或用掃描工具確認 135 通。防火牆需放行雙向 135 及動態端口範圍 (可透過註冊表限制 RPC 動態端口範圍再開放)。
發起事務的伺服器上,連結伺服器的查詢/視圖/預存程序 不得包含查詢發起端自身的物件。這稱為 Loopback,MSDTC 不支援,會導致啟動失敗。
SET XACT_ABORT ON對大多數 OLE DB 提供者 (含 SQL Server),隱式/顯式事務中若有資料修改,必須 設 SET XACT_ABORT ON,否則分散式事務無法登記。
唯一例外:提供者支援巢狀事務時 (SQL Server 不支援)。
「管理工具」→「元件服務」→「電腦」→「我的電腦」右鍵→屬性→【MSDTC】頁籤→【安全性配置】:
配置完成後會自動重啟 MSDTC 服務。
建立連結伺服器兩種方式,需確保引擎與 DTC 皆能解析:
EXEC sp_addlinkedserver @server='LinkSrv', @srvproduct=N'SQL Server'; → @server 必須是可解析的遠端伺服器名或 IP。EXEC sp_addlinkedserver @server='LinkSrv', @provider='SQLNCLI', @datasrc='RemoteSrv'; → @datasrc 為實際遠端伺服器名/IP。驗證:在發起端 ping RemoteSrv、nslookup RemoteSrv、telnet RemoteSrv 1433 皆通。
| 項目 | 驗證命令/位置 | 預期結果 |
|---|---|---|
| MSDTC 服務 | services.msc | Running, Auto |
| TCP 135 | telnet IP 135 | 連線成功 |
| Loopback | 檢查連結伺服器物件定義 | 無查詢本端物件 |
| XACT_ABORT | 事務開頭 | SET XACT_ABORT ON |
| MSDTC 安全性 | 元件服務 → 我的電腦 → MSDTC → 安全性配置 | 上述 5 項全勾選 |
| 名稱解析 | ping / nslookup / telnet 1433 | 全部通 |
sp_configure 'remote proc trans', 1 就夠了 → 那是舊選項,核心在 MSDTC 設定。