2012-02-15 11 views
4

EJB 3.1のトランザクションについて理解してください。 GlassFish v3を使用していて、次のような状況があります。EJB 3.1 TransactionAttributeType.REQUIRES_NEWおよびsetRollbackOnly

@Stateless 
@LocalBean 
public class BeanA { 

    @Inject BeanB bean; /* which has no TransactionAttribute set */ 
    @Resource SessionContext context; 

    public void run() { 
     ... 
     for (...) { 
      process(someValue); 
     } 
    } 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void process(String someValue) { 

     try { 

      SomeEntity entity = bean.getEntity(someValue); 
      entity.setSomeProperty("anotherValue"); 

      ... 

     } catch(CustomException e) { 
      this.context.setRollbackOnly(); 
     } 
    } 

} 

サーブレットからBeanA.runが呼び出されました。私は、それぞれの反復を別々のトランザクションとして扱いたい。私はTransactionAttributeType.REQUIRES_NEWを使用してこれを実現すると思ったが、setRollbackOnlyを呼び出した後にbeanBの後続の反復でjavax.ejb.EJBTransactionRolledbackExceptionが発生する。しかし、私はすべてを動かして新しいBeanCにrun()し、beanC.processを呼び出す代わりに、それはうまくいきます。私は何が欠けていますか?なぜ誰かがこれがどうやって動作するのか、いくつかの光を当てることができますか?

編集:考えてみましょう:コンテナが同じEJB内のメソッドへの呼び出しをインターセプトしないためですか?

編集2(合理的と思われるもの):うん、ここに答えが見つかりました:EJB Transactions in local method-calls

+0

あなたの質問に対する回答を記入し、解決済みと印を付けて、問題に適切なフラグを付けることができるようにしてください。さらに、以下のリソースが役立つかもしれません:http://stackoverflow.com/questions/8079142/transactionattribute-requires-new-in-jpa/8079752#8079752 http://piotrnowicki.com/2011/11/am-i -in-the-same-transaction-am-i-using-same-persistencecontext/http://stackoverflow.com/a/7218283/920607 –

+0

入力いただきありがとうございます。私は自分の質問に答えるまでにさらに7時間待たなければなりません。 –

答えて

4

はここに答えが見つかりました(私もそれを見つけるために答えを知っていた:)):EJB Transactions in local method-calls

Inをshort:コンテナはローカルメソッド呼び出しをインターセプトしないため、setRollbackOnlyはロールバックのための単独のトランザクションをマークし、例外を説明しています。

関連する問題