[Seasar-user:11361] Re: requiresNewTxにてcommit時に例外が発生した場合にRollbackされない

鈴木 順 [E-MAIL ADDRESS DELETED]
2007年 10月 31日 (水) 19:07:29 JST


小林さん

お世話になっています。鈴木です。

異常系の試験で不正なデータが作られており、調査を行っておりました。
結果requiresNewTxが入れ子になっており、
Rollbackされていないと想定してしまい、
先ほど投稿してしまいました。

返信を頂き再度調査したところ、全く別の問題でした。

大変ご迷惑をおかけして申し訳ございません。

以後気をつけます。

On Wed, 31 Oct 2007 17:00:30 +0900
Koichi Kobayashi <[E-MAIL ADDRESS DELETED]> wrote:

> 小林 (koichik) です.
> 
> Date:    Wed, 31 Oct 2007 15:53:03 +0900
> From:    鈴木 順 <[E-MAIL ADDRESS DELETED]>
> To:       [E-MAIL ADDRESS DELETED]
> Subject: [Seasar-user:11350] requiresNewTxにてcommit時に例外が発生した場合にRollbackされない
> 
> > S2.4.16を利用して、requiresNewTxにてトランザクション管理を行っています。
> > 「commit時に例外が発生した場合にRollbackされない」と言う事象が発生しております。
> 
> ロールバックされないとは具体的にどういう
> 現象になるのでしょうか?
> 
> > 具体的に言いますと、
> > RequiresNewInterceptorのinvoke()のend()にて例外が発生し、
> > complete()が呼ばれます。
> > complete()よりRollback()が呼ばれ、
> > Rollback()内で、hasTransaction()がfalseとなる為、
> > userTransaction.rollback();が呼ばれません。
> 
> 呼ぶ必要がありません.
> UserTransaction#commit() が例外をスローしたと
> いうことは,トランザクションをコミットすることが
> できなかったということであり,ロールバックされたと
> いうことでもあります.
> 
> > 通常のJDBCであれば、commit時に例外が発生する事はまれだと思いますが、
> > (S2)Hibernateを利用している場合には、commit時に全てのSQLが流れますので、
> > commit時に例外が発生する事は稀ではない状況です。
> 
> コミット時といっても,正確には
> Synchronization#beforeCompletion() で例外が
> 発生します.
> S2JTA では (おそらく他の JTA 実装でも),
> beforeCompletion() で例外が発生すると
> トランザクションをロールバックします.
> その後に明示的に rollback() を呼び出す必要は
> ありません.
> というか,トランザクションの状態は既に
> ロールバック済みなので,IllegalStateException が
> 発生します.
> 
> 
> 
> --
> <signature>
>    <name>Koichi Kobayashi</name>
>    <e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
> </signature>
> 
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user





Seasar-user メーリングリストの案内