https://blogs.oracle.com/imc/entry/distributed_transaction_on_oracle_real
このエントリでは、Oracle Real Application Clusters(以下RAC)における分散トランザクションを実装しようとした際に発生した例外の解決方法を説明します。
弊社のパートナーの環境で以下のようなエラーが発生したのですが、その際RAC上の.NETアプリケーションをテストしようとしていました。
Application Error / Event Log
System.Runtime.InteropServices.COMException (0x8004D00A): New
transaction cannot enlist in the specified transaction coordinator.
や
SQL*Net Trace
ORA-24798: cannot resume the distributed transaction branch on another instance
といった具合です。開発およびテスト環境
- Microsoft .NETで開発(訳注:.NET Frameworkのバージョン等の記載は原文にもありません)
- DatabaseはRAC構成(構成自体に問題はありません)
- 4個のアプリケーションサーバノード、アプリケーション側で負荷分散が有効
- アプリケーションは、Microsoft Transaction Transaction Management Serverを利用
- OraOLEDB.Oracleプロバイダが分散トランザクションを呼び出す
解決方法
各サービスに対する優先インスタンスおよび利用可能なインスタンスを1個以上作成しました。
srvctl add service -d DB_UNIQUE_NAME -s SERVICE_NAME1 -r NODE1 -a NODE2
srvctl add service -d DB_UNIQUE_NAME -s SERVICE_NAME2 -r NODE2 -a NODE1
ここで、
-r "<優先インスタンスのリスト>"
-a "<利用可能なインスタンスのリスト>"
です。そして、これらのサービスに対し、DTP(Distributed Transaction Processing)をTrueに修正しました。
execute dbms_service.modify_service (service_name => 'SERVICE_NAME1' ,dtp => true);
execute dbms_service.modify_service (service_name => 'SERVICE_NAME2' ,dtp => true);
このサービスアーキテクチャを使用して同じ作業を再度繰り返した結果、エラーは発生しなくなり、期待通りに動作しました。RAC上の分散トランザクションが原因で発生するエラーのほとんどは、このサービスの設定によって解決できます(訳注:Windowsアプリケーションの場合に限ります)。
最後に、非常に喜ばしいことに、このソリューションは、サポートのNoteとして公開されています。
ORA-24798 Distributed Transaction Exception when Connecting to a RAC Instance from a Windows Application [ID 1443954.1][訳注]
https://support.oracle.com/CSP/main/article?cmd=show&type=NOT&id=1443954.1
アプリケーションを変更して、既存の分散トランザクションに復帰したり、参加しないようにする仕組みを採用できるのであれば、このエラーは発生せず、DTPサービスを作成する必要はありません。
0 件のコメント:
コメントを投稿