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