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