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関連 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック