之前處理過一個鳥問題,使用 ODP.NET 12.1 連線 Oracle Server 10.2.0.4 時無法參與分散式交易,傳回「Unable to enlist in a distributed transaction /無法列於分散式交易中」錯誤。依網路討論 Server 升級到 10.2.0.5 以上可解決,當時決定將資料庫移至另一台 Oracle Server 11.2 成功脫逃,安全下莊。

半年後鳥問題捲土重來,一樣是 ODP.NET 12.1 連 Oracle 10.2.0.4 無法分散式交易,但這回資料庫沒得搬也很難升級,只能乖乖面對。

確認其他機器曾有 ODP.NET 11.2.0.3 成功與 Oracle 10.2.0.4 建立分散式交易,便在同台主機裝了 ODAC 11.2.0.3,程式換用 ODP.NET 11.2.0.3 後錯誤訊息卻完全沒有改變,揮棒落空,心中茫茫然…

招喚茶包一哥-Process Monitor,幸運挖到關鍵線索:

被 ODP.NET 版本惡整經驗豐富,對於發行者原則檔(Publisher Policy)倒也略懂略懂,在讀取上述 Registry 後,之後程式存取的都是 ODP.NET 2.112.0 DLL 檔案,由此識別出這是安裝 Oracle Client 12.1.0 加入的版本強制導向。

在 product\12.1.10\client32\odp.net\PublisherPolicy\2.x 可以找到多個發行者原則檔,分別將 2.102、2.111、2.112、2.121 導向 2.121 版。

Policy.2.112.Oracle.DataAccess.config 內容如下,這解釋為何我們已明確改用 2.112.0.3,仍被導向 2.121.1.0, 導致無法與舊版 Oracle Server 完成分散式交易。

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
          <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
            <bindingRedirect oldVersion="2.112.0.0-2.112.9999.9999" newVersion="2.121.1.0"/>
        </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

從組件管理 GUI 將 2.112 導向 2.121 的原則檔刪除,問題排除!


Comments

Be the first to post a comment

Post a comment