Windows 平台上,**COM+ / .NET Enterprise Services / WCF** 使用 **Microsoft Distributed Transaction Coordinator (MSDTC)** 協調跨資源管理器 (Oracle, SQL Server, MQ) 的 XA 交易。Oracle 需提供 XA Switch 接口給 MSDTC 呼叫。
-- 路徑:$ORACLE_HOME/rdbms/admin/xaview.sql
-- 需以 SYS 身分執行
SQL> @?/rdbms/admin/xaview.sql
-- 腳本會建立兩個視圖:
-- V$XATRANS$ -- 進行中 XA 交易
-- V$PENDING_XATRANS$ -- 待恢復 XA 交易
GRANT SELECT ON V_$XATRANS$ TO PUBLIC;
GRANT SELECT ON V_$PENDING_XATRANS$ TO PUBLIC;
-- 部分文件建議 GRANT SELECT ANY TABLE TO PUBLIC,但最小權限原則僅授視圖即可
# 路徑:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI
# 字串值 (REG_SZ):
"OracleXaLib" = "oraclient19.dll" # 依 Client 版本:oraclient11.dll / oraclient12.dll / oraclient19.dll
"OracleSqlLib" = "orasql19.dll"
"OracleOciLib" = "oci.dll"
# 路徑:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\XADLL
# 新增字串值:
"mtxoci.dll" = "C:\Windows\System32\mtxoci.dll"
# 確保 mtxoci.dll 存在 (Windows 內建,或 Oracle Client 安裝目錄複製)
-- 1. 確認視圖可見
SQL> SELECT * FROM V$XATRANS$;
SQL> SELECT * FROM V$PENDING_XATRANS$;
-- 2. 簡單 COM+ 元件測試 (VB6/.NET)
-- 建立使用 Transaction 屬性 = Required 的 COM+ 元件
-- 呼叫 Oracle 更新操作,觀察 MSDTC 事件日誌 (Event Viewer → Applications and Services → Microsoft → Windows → MSDTC)
-- 成功特徵:XA Start → XA End → XA Prepare → XA Commit (兩階段提交)
| 錯誤現象 | 可能原因 | 解決 |
|---|---|---|
| XAER_RMERR / ORA-03113 | OracleXaLib 路徑錯誤、版本不符 | 確認 oraclientXX.dll 存在於 PATH、位元數匹配 (32/64-bit) |
| XAER_PROTO / "Transaction Manager not available" | MSDTC 服務未啟動、防火牆阻擋 135/動態 RPC port | 啟動 MSDTC、開放 RPC 動態埠範圍 (注冊表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Rpc\Internet\Ports) |
| "The partner transaction manager has disabled its support for remote/network transactions" | 雙向 MSDTC 安全性未啟用 Network Access | 雙端皆啟用 Network DTC Access、Allow Inbound/Outbound |
| 權限拒絕 (Access Denied) | Network Service 無 Administrators 權限 | 加入 Administrators 或改用專用帳號 |
-- 完全不需要 COM+/MSDTC 註冊表配置
using (var scope = new TransactionScope())
{
using (var conn = new OracleConnection(connStr)) // ODP.NET Managed
{
conn.Open();
// 多個連線/資源自動升級為分散式交易
cmd.ExecuteNonQuery();
}
scope.Complete();
}
**ODP.NET Managed Driver (12c+)** 內建 **Promotable Single Phase Enlistment (PSPE)**,單一 Oracle 連線保持本地交易,多連線自動升級 XA,**零配置、零註冊表、支援 .NET Core / Linux 容器**,**強烈建議新專案採用**。
傳統 COM+/MSDTC + Oracle XA 配置步驟繁瑣、易出錯、平台鎖定。**核心三步:建視圖、授權、註冊表+MSDTC 安全性**。現代開發請直接使用 **ODP.NET Managed + System.Transactions**,享受零配置分散式交易,並支援跨平台部署。若維護舊系統,請將上述註冊表與權限設定納入 **自動化部署腳本 (PowerShell/Ansible)**,確保環境一致性。