[Seasar-user:18313] Re: [S2Tx] RequiresNewTxの挙動について

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2009年 8月 18日 (火) 17:00:00 JST


小林 (koichik) です.

Date:    Tue, 18 Aug 2009 11:26:28 +0900
From:    "Nishiwaki Kiyoyuki" <[E-MAIL ADDRESS DELETED]>
To:      Seasar User メーリングリスト <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:18306] [S2Tx] RequiresNewTxの挙動について

> サンプルでは、Serviceに対して TxAttributeCustomizer を適用して
> 以下のようにアノテーションでのトランザクションの種類を指定しています。
> 
> Test1Service : RequiredTx
> Test2Service : RequiresNewTx
> Test3Service : RequiredTx

TxAttributeCustomizer を使うなら,EJB3 の
@TransactionAttribute アノテーションを使う必要が
あります.
以下の表の TxAttributeCustomizer の欄を参照して
ください.

http://s2container.seasar.org/2.4/ja/DIContainer.html#StandardCustomizer

添付のサンプルは Seasar2 の @RequiresNewTx 等が
使われているため TxAttributeCustomizer はこれを
認識せず,全てのメソッドをデフォルトの
Required としています.

それとは別に @RequiresNewTx アノテーションが
指定されているため,RequiresNew も設定されます.

この結果,Test2Service の @RequiresNewTx が
指定されたメソッドは RequiresNew と Required の
インターセプタが重複して設定されます.
# @RequiredTx が指定されたメソッドは Required が
# 重複して設定されます.

インターセプタが呼び出される順番は Required -> 
RequiresNew となります.

> この際、Test1ServiceのトランザクションをTx1、
> Test2Service、Test3ServiceのトランザクションをTx2として。
> 
> Test3ServiceにてRuntimeExceptionをスローし
> Test1ServiceでCatchして例外を握りつぶす(例外を再スローしない)場合
> Tx1、Tx2共にロールバックされました。

Test2Service に設定された Required のインターセプタ
(これは RequiresNew より外側なので Tx1 のコンテキストに
なります) を例外が通過するため,トランザクションは
ロールバックするようにマークされます.これは,

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

に記述してあるとおりであり,

> 確認したい点は、
> Tx1もロールバックされますが、これはS2Txの仕様でしょうか?

仕様です.


実際にやりたいことを実現するには,Seasar2 の
@RequiredTx や @RequiresNewTx アノテーションではなく,
EJB3 の @TransactionAttribute を指定してください.


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