4

トランザクション管理に頭を悩ませようとしていますが、トランザクションのロールバックから回復して新しいトランザクションをコミットし続ける方法を理解するのに苦労しています。以下のコードは、私がやろうとしていることの単純化されたバージョンです。

@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?
        }
    }
}
4

1 に答える 1

3

processObjectsの呼び出しは、(個別の)トランザクションで行われます。あなたはすべてを捕まえていRuntimeExceptionます、それらの例外を2つのグループに分けましょう。

グループ1: EJBExceptionまたは->で注釈が付けられたその他の例外@ApplicationException(rollback=true)コンテナはその例外をロールバックします。

グループ2:他のすべての例外。(基本的に、コンテナによって自動的にロールバックされない例外:()。->トランザクションは、そうしない限りロールバックされません。

ロールバックを強制するには、いつでもthrow new EJBException...など...

また、例外@ApplicationException(rollback=true)がスローされると、コンテナは現在のトランザクションをロールバックすることに注意してください(EJB-Beansはデフォルトでトランザクションに含まれています)。 Beanには@TransactionManagement(TransactionManagementType.CONTAINER)、EJBのデフォルトである注釈が付けられています。

于 2012-09-03T22:03:46.997 に答える