[Seasar-user:12064] Re: Transaction境界を設定したコンポーネントが階層的に呼び出された場合

Mitsutaka Sato [E-MAIL ADDRESS DELETED]
2007年 12月 12日 (水) 19:24:25 JST


佐藤です。
たびたびすみません。

あるトランザクションAの途中に requiresNewTx で別のトランザクションBを取得して
処理を行なうロジックがあるとき、AでsetRollbackOnly()をした後に、Bが実行されると
以下のExceptionが発生します。

==============================
Caused by: org.seasar.framework.exception.SIllegalStateException:
[ESSR0308]既にロールバックとしてマークされています
    at org.seasar.extension.jta.TransactionImpl.throwIllegalStateException(
TransactionImpl.java:132)
    at org.seasar.extension.jta.TransactionImpl.assertActive(
TransactionImpl.java:117)
    at org.seasar.extension.jta.TransactionImpl.suspend(TransactionImpl.java
:98)
    at org.seasar.extension.jta.TransactionManagerImpl.suspend(
TransactionManagerImpl.java:78)
    at org.seasar.extension.tx.AbstractTxInterceptor.suspend(
AbstractTxInterceptor.java:194)
    at org.seasar.extension.tx.RequiresNewInterceptor.invoke(
RequiresNewInterceptor.java:46)
==============================

Aをsuspendしようとするときに発生するようですが、これは仕方の無いことでしょうか?

この例のサンプルコードは以下のような形です。

Class HogeService {

 private FugaService fugaService;
 private OtherTxService otherTxService;
 private UserTransaction userTransaction;

 public void execute() {
   doSomething();
   try {
     fugaService.execute();
   } catch (Exception e) {
     userTransaction.setRollbackOnly();
     log.info(e);
   }
   doSomething2();
   otherTxService.execute();     <== S2Tx で requresNewTx をAspectしてるメソッド
   doSomething3();
 }

}


On Dec 11, 2007 10:39 PM, Mitsutaka Sato <[E-MAIL ADDRESS DELETED]> wrote:

> 小林様、
> ご教授ありがとうございました。
>
> 初歩的なTransactionの使い方がよくわかっていませんでした・・・
>
> いずれにしろ、
> UserTransacitonをDIして使用すればよいようですね。
> ありがとうございました。
>
>
> On Dec 8, 2007 9:00 PM, Koichi Kobayashi < [E-MAIL ADDRESS DELETED]> wrote:
>
> > 小林 (koichik) です.
> >
> > Date:    Sat, 8 Dec 2007 12:55:20 +0900
> > From:    "Mitsutaka Sato" <[E-MAIL ADDRESS DELETED]>
> > To:      [E-MAIL ADDRESS DELETED]
> > Subject: [Seasar-user:12000] Re: Transaction境界を設定したコンポーネントが階層的に呼び出された場合
> >
> > >     // トランザクションコミット
> > >     // ※ hogeService内でfooSerivceの例外をキャッチしてsetRollbackOnlyしてる
> > >     // かもしれないが、commit()でOK?
> > >     userTransaction.commit();
> > (略)
> > > このように書くのが正しい*スタイル*でしょうか?
> >
> > いいえ.
> > setRoolbackOnly() した後に commit() を
> > 呼び出すと例外が吹っ飛んできます.
> >
> > if (userTransacstion.isRollbackOnly) {
> >  userTransaction.rollback();
> > } else {
> >  userTransaction.commit();
> > }
> >
> > のようにしてください.
> >
> >
> > --
> > <component name="koichik">
> >    <property name="fullName">"Koichi Kobayashi"</property>
> >    <property name="email">" [E-MAIL ADDRESS DELETED]"</property>
> >    <property name="blog">"http://d.hatena.ne.jp/koichik "</property>
> > </component>
> >
> > _______________________________________________
> > Seasar-user mailing list
> > [E-MAIL ADDRESS DELETED]
> > https://ml.seasar.org/mailman/listinfo/seasar-user
> >
>
>
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: http://ml.seasar.org/archives/seasar-user/attachments/20071212/e7d2b795/attachment-0001.html 


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