[Seasar-user:16053] Re: RequiresNewTx でトランザクションが開始できない

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2008年 10月 18日 (土) 22:00:28 JST


小林 (koichik) です.

Date:    Sat, 18 Oct 2008 09:49:11 +0900
From:    "Mitsutaka Sato" <[E-MAIL ADDRESS DELETED]>
To:      seasar-user <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:16051] RequiresNewTx でトランザクションが開始できない

> 上記のテストケースを実行すると、requiresNewTx の開始で以下のエラーが発生します。
> 
> org.seasar.framework.exception.SIllegalStateException:
> [ESSR0308]既にロールバックとしてマークされています

報告ありがとうございます.
修正して SNAPSHOT をデプロイしたのでご確認ください.

http://maven.seasar.org/maven2-snapshot/org/seasar/container/s2-framework/2.4.31-SNAPSHOT/s2-framework-2.4.31-20081018.124630-4.jar
http://maven.seasar.org/maven2-snapshot/org/seasar/container/s2-framework/2.4.31-SNAPSHOT/s2-framework-2.4.31-20081018.124630-4.jar
http://maven.seasar.org/maven2-snapshot/org/seasar/container/s2-tiger/2.4.31-SNAPSHOT/s2-tiger-2.4.31-20081018.125240-4.jar


> ちなみにs2-2.4.17まではエラーは発生せず、 s2-2.4.18 から上記エラーは発生します。

今回の修正後も 2.4.17 以前とは微妙に動作が
異なります.

掲載のテストケースだと,2.4.17 以前では
「UserTransactionをコミットしました。」という
メッセージが (たぶん) 出力されますが,2.4.18
以降では出力されません.

これは,alwaysExceptionService#execute() から
例外がスローされると 2.4.18 以降では
setRollbackOnly() が設定されるからです.

2.4.17 以前では,トランザクションが開始済みの
状態で呼び出される requiredTx は,トランザクションの
コミットにもロールバックにも関与しませんでしたが,
2.4.18 以降では例外で抜けていく場合に 
setRollbackOnly() します.
これは,例外が飲み込まれた場合にトランザクションが
コミットされてしまうのを防ぐためで,EJB 仕様でも
そうなっています.
# EJB では RuntimeException や EJBException
# など一部を除いた多くの例外はロールバックしない
# 例外ですが.

もし,例外がスローされた場合に setRoolbackOnly() を
設定されたくない場合は,独自の j2ee.dicon を用意して,
以下で説明されている addCommitRule() で該当の例外を
登録してください.

http://s2container.seasar.org/2.4/ja/tx.html#Exception

独自の j2ee.dicon は WEB-INF/classes など,Seasar2 の
Jar ファイルより優先されるクラスパスに配置する必要が
あります.



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