2012年01月31日

s2jdbcでロールバックされない。

とあるActionのメソッドが実行されて、そのメソッド内で2つのprivateメソッドが呼ばれている。

privateメソッド内ではDBを更新しまくっていて、その際に2つめのprivateメソッドでExceptionが発生した。

それはいいのだけど、なぜか1つめのprivateメソッドの更新内容がコミットされていた。。。

なぜだ?

j2ee.requiredTxインターセプターで自動的にトランザクション管理ができているはずなのに。

SAStrutsではデフォルトでは実質的にActionのpublicメソッドがトランザクションの境界と考えて差し支えなかったはずなのだが?

よくよくソースを見てみると、try-catchをしており、throwもしてなかった。。。

これだと、インターセプターが例外を取得できないので正常処理と判断されコミットされてしまうというオチでした。

解決策として、

・例外をthrowする。
・throwしたくないときは、chtch内でuserTransaction.setRollbackOnly();を使う。
・@TransactionAttribute(TransactionAttributeType.NEVER)を使って完全手動制御する。

くらいかな?

特別な理由がない場合はインターセプターに例外を渡すのでいいと個人的には思う。
posted by hana at 15:31| Comment(0) | TrackBack(0) | seasar関連 | このブログの読者になる | 更新情報をチェックする