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

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2009年 5月 18日 (月) 19:30:32 JST


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