[Seasar-user:17005] [S2JDBC]トランザクションについて

Shinzo SAITO [E-MAIL ADDRESS DELETED]
2009年 2月 27日 (金) 15:31:25 JST


齊藤新三と申します。
お世話になります。

S2JDBCのトランザクション制御に関してお尋ねいたします。

S2AbstractServiceを継承した2コのServiceクラス、
Hoge1ServiceとHoge2Service
があるとします。この中に、データアクセスロジックが記載された
Hoge1Service#findByPK(Integer code)
Hoge2Service#findByUser(String name)
というメソッドがあるとします。これに、S2AbstractServiceから継承されたメソッドupdateも使用して、(SAStrutsの)Actionクラスでひとつのトランザクションとしたいと考えます。その場合、どのように記載すればいいのでしょうか。

例えば、BowActionクラスがあり、その中に上記3メソッドを使用するssEdxメソッドがあったとします。その上で、以下のようなソースコードを実行した場合、例外が発生し、「[ESSR0316]ネストしたトランザクションはサポートしていません」というメッセージが出てしまいます。

public class BowAction {
  @Resource
  public UserTransaction userTransaction;
  @Resource
  public Hoge1Service hoge1Service;
  @Resource
  public Hoge2Service hoge2Service;
  @Execute(validator=false)
  public String ssEdx() {
      〜〜〜省略〜〜〜
    try {
      userTransaction.begin();
      Hoge1Entity entity1 = hoge1Service.findByPK(code);
      Hoge2Entity entity2 = hoge2Service.findByUser(name);
      〜〜〜省略〜〜〜
      hoge2Service.update(entity);
      userTransaction.commit();
    }
    catch(Exception ex) {
      throw new DataAccessException(ex);
    }
      〜〜〜省略〜〜〜
  }
}

このように、Serviceクラスの複数のメソッドをひとつのトランザクションでくくりたいときの記述方法を教えていただけますでしょうか。

ところで、ロールバックに関してですが、当初、上記のソース例で行きますと、catch節内に
userTransaction.rollback();
を記述していましたが、これも例外が発生しています。ソースを追っていきますと、どうも、例外が発生した場合は自動でロールバックするようになっているみたいですが、その認識で問題ないでしょうか?つまり、userTransaction.rollback();をいちいち記載しなくても、例外を発生させておけば、ロールバックは自動でしてくれるという認識です。ちなみに、DataAccessExceptionはRuntimeExceptionを継承しています。

以上、お手数ですが、よろしくお願いします。

-- 
***********************
       齊藤  新三
E-mail [E-MAIL ADDRESS DELETED]
***********************


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