| Oracle でのトランザクションリカバリ障害への対応 |
トランザクションを実行するユーザアカウントに対してDBA_PENDING_TRANSACTIONS ビューのSELECT権限が付与されていない場合、トランザクションのリカバリ処理が異常終了し、次のエラーメッセージがイベントログ(UNIXではsyslog)に出力されます (XXXX の部分には、動作状況に応じて異なる値が出力されます)。
The XA function has failed because of a cause indicated by the code. function =xa_recover() for JDBC(xxxx) rc = -3
また、Oracle Database 10g Release 2 以降を使用する場合、トランザクションを実行するユーザアカウントに対してDBMS_SYSTEMパッケージへのEXECUTE権限が付与されていないと、同様の障害が発生します。
「トランザクションを実行するユーザ」とは、JDBC データソースの定義で指定したユーザか、EJB の配備時にリソース参照設定で指定したユーザ、あるいは、プログラム中でJDBC コネクションを取得する際に指定しているユーザ、または、TransactionサービスのJDBCリソースの定義で指定したユーザ(デフォルトではJDBCデータソースの定義と同じユーザ)のいずれかになります。
sqlplus 等で、トランザクションを実行するユーザアカウントで次のコマンドを実行し、権限が付与されているかどうかを確認してください。
DBA_PENDING_TRANSACTIONSビューの参照:
> select * from dba_pending_transactions;
トレースファイルへのタイムスタンプ書き出し:
> exec dbms_system.ksdddt;
権限付与が正しく行われている場合には、エラーが発生しません。