ODP.NET 發行者原則檔經驗一則
0 |
之前處理過一個鳥問題,使用 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