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

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


小林さん

お世話になっています。度々すみません。鈴木です。

> 全く別の問題でした。

トランザクションを入れ子にせず、問題を切り分けていき当たりがつきましたが、
依然解決せずなので、何か分かりましたらお教え下さい。

そもそもトランザクション管理ができていない動きになってしまってます。
簡単に言いますとAutoCommit=trueのような動きをしております。
エラーが発生する以前に実行されているSQL文がDBに反映されています。
TxのAspectは正しく適用されていると思います。
HibernateのSession.flushがTxのInterceptorから呼ばれてます。
一応Hibernateの中までデバッグして行ったら使用している
コネクションのAutoCommitはtrueとなってました。
どこかで明示的にAutoCommit=falseとするような設定があるのでしょうか?

以下のような感じでDIに定義してWEB.xmlにFilterを定義しています。
    <component name="filterChainTx" class="org.seasar.hibernate3.filter.FilterChainTxImpl">
 		<aspect pointcut="doFilter">j2ee.requiredTx</aspect>
    </component>

環境はTOMCATでDataSourceはweb.xmlに定義してあります。

なにか確認点やお分かりになる事がありましたら、お教えください。


On Wed, 31 Oct 2007 19:07:29 +0900
鈴木 順 <[E-MAIL ADDRESS DELETED]> wrote:

> 
> 小林さん
> 
> お世話になっています。鈴木です。
> 
> 異常系の試験で不正なデータが作られており、調査を行っておりました。
> 結果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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user


_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

株式会社ワークスアプリケーションズ

               鈴木 順(Sunao Suzuki)

東京都港区赤坂1-12-32 アーク森ビル19F
 内線   : 4621
 E-Mail : [E-MAIL ADDRESS DELETED]

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/




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