トランザクション管理に頭を悩ませようとしていますが、トランザクションのロールバックから回復して新しいトランザクションをコミットし続ける方法を理解するのに苦労しています。以下のコードは、私がやろうとしていることの単純化されたバージョンです。
@Stateless
public class MyStatelessBean1 implements MyStatelessLocal1 {
@EJB
private MyStatelessLocal1 myBean1;
@TransationAttribute(TransactionAttributeType.NEVER)
public void processObjects(List<Object> objs) {
// this method just processes the data; no need for a transaction
for(Object obj : objs) {
// If the call to process results in the transaction being rolled back,
// how do I rollback the transaction and continue to iterate over objs?
this.myBean1.process(obj);
}
}
@TransationAttribute(TransactionAttributeType.REQUIRES_NEW)
public void process(Object obj) {
// do some work with obj that must be in the scope of a transaction
}
}
の呼び出しでトランザクションのロールバックが発生した場合process(Object obj)
、例外がスローされ、の残りのオブジェクトはobjs
繰り返されず、更新はコミットされません。エラーが発生したトランザクションをロールバックしたいが、objs
リストを繰り返し処理し続ける場合、どのようにすればよいですか?以下のコードのように例外をキャッチした場合、トランザクションがロールバックされていることを確認するために何かする必要がありますか?
public void processObjects(List<Object> objs) {
// this method just processes the data; no need for a transaction
for(Object obj : objs) {
// If the call to process results in the transaction being rolled back,
// how do I rollback the transaction and continue to iterate over objs?
try {
this.myBean1.process(obj);
} catch(RuntimeException e) {
// Do I need to do anything here to clean up the transaction before continuing to iterate over the objs?
}
}
}