[Seasar-user:17471] Re: 【S2JDBC】TransactionAttributeType.SUPPORTSの利用方法について

Toshiaki Takashima [E-MAIL ADDRESS DELETED]
2009年 5月 18日 (月) 20:18:37 JST


小林様


 高島です。詳細なご説明ありがとうございました。

> ・A の場合
> 

 私のケースでは、ご提示していただいたオプションのうち
Aに該当しますので、diconファイルに対する設定は必要ない
です。

 なお、後学のためにいま1つご教授願います。

> @Resource
> private UserTransaction userTransaction;
> 
> public void hoge() { // 1 のメソッド
>   ...
>   try {
>     hoge();  // 2 のメソッド
>   } catch (HogeException e) {
>     userTransaction.setRollbackOnly();
>   }

上記サンプルでUserTransactionに指定されている@Resource
アノテーションですが、上記サンプルモジュールがSeasar以外の
EJBコンテナで互換動作することを目的としており、Seasar以外
のコンテナでの動作を想定しないコンポーネント内では本アノテー
ションは使用しなくともUserTransactionコンポーネントを利用
可能、という理解でよろしいでしょうか?


以上よろしくお願いします。

> 小林 (koichik) です.
> 
> Date:    Mon, 18 May 2009 18:46:12 +0900
> From:    Toshiaki Takashima <[E-MAIL ADDRESS DELETED]>
> To:      [E-MAIL ADDRESS DELETED]
> Subject: [Seasar-user:17468] 【S2JDBC】TransactionAttributeType.SUPPORTSの利用方法について
> 
> > その際、EJB 3.0のTransactionAttributeアノテーションを利用
> > してトランザクション管理しているのですが、コンポーネントから
> > コンポーネント・メソッドの呼出しを行っているとき、
> > 
> > 1.呼出し元のメソッドがトランザクションを開始している場合
> > は、呼出し先メソッドでも同じトランザクションを使いたい
> > 
> > 2.ただし、1の条件下において、呼び出し先で例外が発生した
> > としても、呼出し元のトランザクションに影響(ロールバック)を
> > 与えたくない
> > 
> > というトランザクション制御を呼出し先メソッドに対して行いたい
> > と考えています。
> 
> 呼び出し元がトランザクションを開始しないで
> 2 を呼び出した場合,どうすべきなのでしょうか?
> 
> A.トランザクションを開始しない
> B.トランザクションを開始する
> 
> また,B の場合に 2 が例外をスローした場合,
> そのトランザクションはどうすべきなのでしょうか?
> 
> B1.トランザクションをコミットする
> B2.トランザクションをロールバックする
> 
> 
> ・A の場合
> 
> > そこで、"TransactionAttributeType.SUPPORTS"を呼出し先
> > メソッドに指定してみると希望する動作になっているようなのです
> > が、利用しても問題ないでしょうか?どうも"SUPPORTS"に対して
> > はインターセプタが準備されていないようなのですが。
> 
> で構いません.
> SUPPORTS はトランザクションを開始したり中断したり
> する必要もなければ,コミットしたりロールバックする
> 必要もないため,実際にはインターセプタは設定されません.
> 
> 
> ・B1 の場合
> 
> Seasar2 の配布ファイルに含まれている j2ee.dicon を
> コピーして,2 で適用するトランザクションタイプの
> インターセプタに,2 がスローする例外を以下のように
> 設定してください.
> 
> <component name="requiredTx"
>  class="org.seasar.extension.tx.RequiredInterceptor">
>   <initMethod name="addCommitRule">
>     <arg>@[E-MAIL ADDRESS DELETED]</arg>
>   </initMedhod>
> </component>
> 
> 2 がスローする例外が多数あったり,同じ例外でも別の
> メソッドからスローされた場合はトランザクションを
> ロールバックする必要がある場合は,ThrowsInterceptor を
> 使って commitRule に登録する例外に変換してください.
> その ThrowsInterceptor は txAttributeCustomizer より
> 後に設定する必要があります.
> 
> 
> ・B2 の場合
> 
> B1 の設定に加えて,呼び出し側で 2 がスローした
> 例外をキャッチし,UserTransaction#setRollbackOnly() を
> 呼び出してください.
> 
> @Resource
> private UserTransaction userTransaction;
> 
> public void hoge() { // 1 のメソッド
>   ...
>   try {
>     hoge();  // 2 のメソッド
>   } catch (HogeException e) {
>     userTransaction.setRollbackOnly();
>   }
> 
> 2 を呼び出すメソッドが複数あるなら,この処理を
> (B1 とは別の) ThrowsInterceptor で行うこともできます.
> その場合の ThrowsInterceptor は,txAttributeCustomizer
> より前に設定する必要があります.
> 
> 
> -- 
> <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





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