需在 Oracle 建立 XA 視圖並授權,客戶端註冊表設定正確 DLL 路徑,才能支援分散式交易 (XA/兩階段提交)。
@$ORACLE_HOME/rdbms/admin/xaview.sql產生兩個視圖:
V$XATRANS$、V$PENDING_XATRANS$GRANT SELECT ON V$XATRANS$ TO PUBLIC WITH GRANT OPTION; GRANT SELECT ON V$PENDING_XATRANS$ TO PUBLIC WITH GRANT OPTION; GRANT SELECT ANY TABLE TO PUBLIC; -- 建議改為精確授權
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI] "OracleXaLib"="oraclient9.dll" "OracleSqlLib"="orasql9.dll" "OracleOciLib"="oci.dll"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\XADLL] "mtxoci.dll"="C:\WINDOWS\SYSTEM32\MTXOCI.DLL"
Network Service 帳號Network Service 加入本機 Administrators 群組 (或授予足夠 Oracle Client 存取權限)[ ] Oracle xaview.sql 執行成功,視圖存在
[ ] PUBLIC SELECT 權限已授予
[ ] 客戶端 MTxOCI 註冊表鍵值正確指向 Oracle 9i Client DLL
[ ] Windows 2003/XP2+ XADLL 鍵值存在
[ ] Network Service 有權存取 Oracle Client 目錄與 DLL
[ ] 使用 DTC 測試工具 (dtctester.exe) 或 COM+ 應用驗證分散式交易 Commit/Rollback
| 現象 | 可能原因 | 排查方向 |
|---|---|---|
| XA_OPEN 失敗 | DLL 版本不符/路徑錯誤 | 檢查註冊表指向的 DLL 是否為正確 Oracle Home 版本 |
| XA_START 失敗 | 權限不足/視圖缺失 | 確認 V$XATRANS$ 存在且 PUBLIC 可 SELECT |
| 兩階段提交掛起 | 網路/防火牆/監聽器 | 檢查 1521/動態埠連通、MTS/COM+ 服務狀態 |
| In-doubt 交易殘留 | 協調者失敗 | DBA 手工 HEURISTIC COMMIT/ROLLBACK,查詢 V$PENDING_XATRANS$ |
| Oracle 版本 | XA Lib | SQL Lib | OCI Lib |
|---|---|---|---|
| 9i | oraclient9.dll | orasql9.dll | oci.dll |
| 10g | oraclient10.dll | orasql10.dll | oci.dll |
| 11g+ | oraociei11.dll (Instant Client) | 同上 | oci.dll |
MTS/COM+ 與 Oracle XA 整合屬於經典企業級整合場景。核心在於:**Oracle 端視圖就緒 + 客戶端 DLL 註冊表精準指向 + 服務帳號權限到位** 三者缺一不可。現代 .NET 應用建議改用 System.Transactions + OracleManagedDataAccess 簡化部署。