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
あなたの質問に対する回答を記入し、解決済みと印を付けて、問題に適切なフラグを付けることができるようにしてください。さらに、以下のリソースが役立つかもしれません: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 –
入力いただきありがとうございます。私は自分の質問に答えるまでにさらに7時間待たなければなりません。 –