トランザクション制御を行う場合、以下に注意してください。
「トランザクション開始後の接続のみ参加」が有効なJDBCリソースを使用し、JTAトランザクション範囲外でオープンした接続を、JTAトランザクション範囲内でクローズするとRAR5031のエラーが発生します。
JTAトランザクション範囲外でオープンした接続は、JTAトランザクション範囲外で接続をクローズしてください。
トランザクション内でXADataSourceを使用したSQLの実行時にデータベースでエラーが発生した場合、その後トランザクションをコミットするときに以下の例外が発生します。
トランザクションがEJBのコンテナで管理されている場合
コンテナがトランザクションをコミットするときに以下の例外が発生します。
jakarta.ejb.EJBException: Unable to complete container-managed transaction. |
また、サーバーログには以下のメッセージが出力されます。
JTS6100: An XAException occurred in two phase commit. org.postgresql.xa.PGXAException: 準備トランザクションのコミットエラー (70214) |
トランザクションがEJBのBeanで管理されている場合
jakarta.transaction.UserTransactionのcommitメソッドを呼び出したときに以下の例外が発生します。
jakarta.transaction.SystemException: org.omg.CORBA.INTERNAL: JTS5031: Exception [org.omg.CORBA.INTERNAL: vmcid: 0x0 minor code: 0 completed: Maybe] on Resource [commit] operation. vmcid: 0x0 minor code: 0 completed: No |
また、サーバーログには以下のメッセージが出力されます。
JTS6100: An XAException occurred in two phase commit. org.postgresql.xa.PGXAException: 準備トランザクションのコミットエラー (70214) |
以下の条件を満たした場合、上記例外が発生します。
PostgreSQLベースのデータベースを使用している場合、かつ
JTAのトランザクションでグローバルトランザクションを開始している場合、かつ
2のトランザクション内でSQL実行時にデータベースでエラーが発生した場合、かつ
3の後でトランザクションをコミットした場合
本現象を回避するためには、以下の対処を行ってください。
実行するSQL文に誤りがある場合は、エラーが発生しないようにSQL文を修正してください、または
JTAのトランザクション内でXADataSourceを使用したSQLの実行時にデータベースでエラーが発生した場合は、トランザクションをロールバックしてください。