執行跨伺服器分散式交易(Linked Server、OPENROWSET、分散式 UPDATE/DELETE)時,出現「伺服器 'XXX' 上的 MSDTC 不可用」或「MSDTC 交易管理器無法啟動」等錯誤。
-- 測試 RPC 通訊埠 (135) 是否開放
telnet <目標伺服器IP> 135
-- 下載 Microsoft 官方 DTCPing 工具進行深度診斷
-- 下載位址: https://www.microsoft.com/en-us/download/details.aspx?id=2819
-- 兩台機器皆需安裝,依 README 操作測試
net stop msdtc
net start msdtc
comexp.msc 或 控制台 → 系統管理工具 → 元件服務NT AUTHORITY\NetworkServicenetsh int ipv4 set dynamicport tcp start=49152 num=16384-- 建議使用 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;
| 錯誤代碼 | 含義 | 建議處理 |
|---|---|---|
| 0x8004D00A | MSDTC 服務未啟動 | 啟動服務、設為自動 |
| 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 已正常運作。
SET XACT_ABORT ON 確保交易原子性