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 等で、トランザクションを実行するユーザアカウントで次のコマンドを実行し、権限が付与されているかどうかを確認してください。

復旧方法
権限が付与されていない場合、sqlplus 等で、sys アカウントで次のコマンドを実行し、トランザクションを実行するユーザアカウントに対して権限を付与してください ("scott"の部分には実際に使用するユーザアカウントを記述してください)。

> grant select on dba_pending_transactions to scott;
> grant execute on dbms_system to scott;

関連情報