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

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2007年 10月 31日 (水) 17:00:30 JST


小林 (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 メーリングリストの案内