2011-12-13 7 views
13

EJBの(トランザクション)メソッドが別のEJBの別の(トランザクション)メソッドを呼び出すときに、例外が2番目のEJBにスローされますが、最初のトランザクションにキャッチされると、 2番目のものが戻るときにロールバックされます。最初のものがキャッチしても、これは本当ですか?どうすればそれを避けることができますか?EJB:トランザクションロールバックを回避する

シナリオは、次のいずれかです。例外は実行時例外である場合

@Stateless 
class ClassA { 
    @EJB 
    ClassB objectB; 

    methodA() { 
     try { 
      objectB.methodB(); 
     } 
     catch(Exception e) { 
      //Here the transaction started in this method is 
      //automatically rolled back. Is this avoidable? 
     } 
    } 
} 

@Stateless 
class ClassB { 
    methodB() throws Exception { throw new Exception() } 
} 

答えて

19

取引はあなたがそう、rollback属性を持つ@ApplicationException注釈がtrueに設定されているRuntimeExceptionまたは任意の例外をスローバックケースでロールされています

@ApplicationException(rollback=true) 
public class MyException extends Exception { 
    // ... 
} 

は現在のトランザクションをロールバックします。

デフォルトでは、ApplicationExceptionはトランザクションをロールバックしません。

methodBをトランザクションにロールバックしたくない場合は、ApplicationExceptionのロールバック動作を変更するか、トランザクションの共有を防ぐことができます。

後者は、方法BのTransactionAttributeRequiresNewに変更することによって達成可能である。メソッドAトランザクション(Tx1)は中断され、メソッドBがそのトランザクション(Tx2)をロールバックさせる例外をスローすると、methodAでそれを捕まえてmethodAトランザクション(Tx1)のロールバックを防ぐことができます。

8

はい、それは、本当です。チェックされた例外は、トランザクションのロールバックを引き起こしません。

これを避けるには、methodBのコードが実行時例外をスローしないようにしてください。実行時例外は通常、バグ、または作業を続行できない状態を示します。

+0

私の悪い、申し訳ありませんが、チェックされた例外がスローされていることに注意するために、このシナリオでもトランザクションがロールバックされていますか? – edutesoy

+1

いいえ、例外が確認済みの例外である場合は、ロールバックしないでください。 –

+1

例外がチェックされていることがわかっている場合は、トランザクションをロールバックするかどうかを指定することはできません。 '@ApplicationException(rollback = true)'の場合、トランザクションをロールバックする可能性があります。 –

関連する問題