首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 支援 MTS 下分散式交易 (XA) 完整配置指南:視圖授權、註冊表與 MSDTC 設定

     編輯:Oracle 資料庫相關知識

應用場景

Windows 平台上,**COM+ / .NET Enterprise Services / WCF** 使用 **Microsoft Distributed Transaction Coordinator (MSDTC)** 協調跨資源管理器 (Oracle, SQL Server, MQ) 的 XA 交易。Oracle 需提供 XA Switch 接口給 MSDTC 呼叫。

資料庫端配置 (Oracle Server)

1. 執行官方 XA 視圖建立腳本


-- 路徑:$ORACLE_HOME/rdbms/admin/xaview.sql
-- 需以 SYS 身分執行
SQL> @?/rdbms/admin/xaview.sql

-- 腳本會建立兩個視圖:
-- V$XATRANS$       -- 進行中 XA 交易
-- V$PENDING_XATRANS$ -- 待恢復 XA 交易

2. 授權 PUBLIC 存取 (關鍵!)


GRANT SELECT ON V_$XATRANS$ TO PUBLIC;
GRANT SELECT ON V_$PENDING_XATRANS$ TO PUBLIC;
-- 部分文件建議 GRANT SELECT ANY TABLE TO PUBLIC,但最小權限原則僅授視圖即可

應用伺服器端配置 (Windows Client / Mid-tier)

1. 註冊表設定 Oracle XA Library 映射


# 路徑: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"

2. Windows 2003 / XP / 2008 / 2012 / 2016 / 2019 額外鍵值


# 路徑:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\XADLL
# 新增字串值:
"mtxoci.dll" = "C:\Windows\System32\mtxoci.dll"
# 確保 mtxoci.dll 存在 (Windows 內建,或 Oracle Client 安裝目錄複製)

3. MSDTC 服務帳號權限 (關鍵!)

  • MSDTC 預設以 **Network Service** 身分運行。
  • **必須**將 Network Service 加入 **本機 Administrators 群組**,否則 XA 呼叫會因權限不足失敗 (Event ID 4389/4390)。
  • 替代方案:將 MSDTC 服務改為特定網域帳號運行,並授予「作為服務登入」、「調整程序記憶體配額」、「替換進程層級 Token」等權限。

4. MSDTC 安全性設定 (Component Services → My Computer → Distributed Transaction Coordinator → Local DTC → Properties → Security)

  • ✅ **Network DTC Access**
  • ✅ **Allow Remote Clients**
  • ✅ **Allow Remote Administration**
  • ✅ **Allow Inbound / Allow Outbound**
  • ✅ **Enable XA Transactions** (XA 交易核心開關)
  • ✅ **No Authentication Required** (測試環境) / **Mutual Authentication Required** (生產需憑證)

驗證測試


-- 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-03113OracleXaLib 路徑錯誤、版本不符確認 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 或改用專用帳號

現代替代方案:.NET System.Transactions + ODP.NET Managed Driver


-- 完全不需要 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)**,確保環境一致性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved