【WebOTX Application Server】UserTransactionのコミットが効かない現象(OTX-FAQ-000134)
質問内容
"UserTransaction"という名前のjavax.transaction.UserTransactionをJNDIサーバからlookupして、Bean管理のトランザクション制御を行っています。JDBCデータソースの「データソースの種別」は、"JDBC"です。
トランザクションのロールバック後、そのトランザクションで使用したJDBCコネクションを使用して、続けてトランザクションを実行した場合にコミットが直ちに行われない現象が発生しています。原因を教えてください。
回答内容
UserTransactionのbegin()を呼び出す前にJDBCデータソースのgetConnection()を呼び出してしまうと、JDBCコネクションとトランザクションが関連付けられませんので、UserTransactionによるcommit()やrollback()の呼び出しが有効に機能しません。
また、データソース種別が"JDBC"の場合、いったんトランザクションに関連付けられたJDBCコネクションのAutoCommitモードは、JDBCコネクションをクローズするまでfalseのままになります。その結果、UserTransactionのcommit()が効かず、java.sql.Connection.commit()も実行されていないため、直ちにコミットが行われない状況になっています。UserTransactionのbegin()の呼び出し後は、その都度、JDBCデータソースのgetConnection()を呼び出してください。
なお、データソース種別が"JDBCEX_Oracle"で、Oracle10g以降のJDBCドライバを利用している場合、トランザクションに関連付けられたJDBCコネクションのAutoCommitモードは、トランザクション完了時に自動的にtrueになります。そのため、UserTransactionのbegin()の前にJDBCデータソースのgetConnection()を呼び出した場合でも、適切にコミットが行われているように見えるかもしれませんが、実際は、SQL命令実行の度に自動コミットが行われており、UserTransactionのrollback()が効かない状況になっています。
【対象製品】Application Server
【確認済みのバージョン】 すべて
【確認済みのエディション】 すべて
【確認済みの対象OS】すべて
【確認済みのJavaバージョン】すべて
【コンポーネント】JDBCデータソース
【カテゴリー】トラブルシューティング
製品名カテゴリ
WebOTX
WebOTX Application Server
-
コンテンツID:
3150102243
-
公開日:
2011年03月31日
-
最終更新日:2018年06月12日
アンケート
サポート情報充実のためアンケートにご協力をお願いいたします。
コメント欄: