2017-11-02 48 views
0

私はBeanAのdoSomeTask()を呼び出しますが、doSomeTask()が失敗した場合、別のテーブルにErrorInfoを保持してsaveError(ErrorInfo )のBeanA。どちらも@TransactionAttribute(REQUIRES_NEW)を持っています。weblogic.transaction.internal.AppSetRollbackOnlyException:トランザクションでsetRollbackOnlyが呼び出されました

class BeanA { 

    @TransactionAttribute(REQUIRES_NEW) 
    public void doSomeTask(){ 

     if(someCondition){ 
      throw new SomeException(); 
     } 

     // do task 
    } 

    @TransactionAttribute(REQUIRES_NEW) 
    public void saveError(ErrorInfo error) { 
      // save error info if doSomeTask fails 
    } 
} 

class BeanB { 

    BeanA beanA; 

    void performTask(){ 
      try{ 
       beanA.doSomeTask();  
      }catch(Exception e){ 
       ErrorInfo error = getErrorInfo(e) 
       beanA.saveError(error); 
      } 
    } 
} 

しかしdoSomeTask()が例外saveError(スロー)仕事と例外

Caused by: weblogic.transaction.internal.AppSetRollbackOnlyException: setRollbackOnly called on transaction 

私は何を間違っているし、どのようにこのエラーを修正するのですがスローされないのですか?助けを前にありがとう。

+0

スパニングトランザクションはありますか? –

+0

いいえ、performTask()は、私が知る限り、トランザクションではありません。 –

+0

あなたのBeanAはコンテナで注入されていますか?私。あなたは "BeanA beanA;"に@EJBアノテーションを持っていますか? ? – user3714601

答えて

0

私はずっと前に同様の問題をデバッグしました。私の場合は問題は、以下の通りであった:

  • REQUIRES_NEW方法は、ネストされたトランザクションで例外後
  • 呼び出されたときに、トップレベルのトランザクションが開いていた「ロールバックとしてマークされてコミットに失敗しましたトップレベル1のコミット「

新しい取引を開始すると、接続ホルダーはTransactionManagerレベルで共有されていることが判明しました。ネストされたトランザクション内で例外がスローされると、接続自体はロールバックのみとしてマークされます。だから後でこれが問題の原因になっています。

セーブポイントを使用して問題を解決できました(JDBC 3.0以降で利用可能)。通常、セーブポイントはデフォルトで多くの環境/ ORMでは無効になっています。

これは何か助けになると思います。

+0

あなたのご意見ありがとうございます、私は確かにそれを調べます。 –

0

申し訳ありませんが、後半の回答です。問題は解決しました。

実際のエラーは表示されませんでした。私の場合、実際のエラーは、永続している間のErrorInfoインスタンスのJSR 303検証エラーです。実際のエラーを見つけると、それを修正するために<domain_home>/bin/setDomainEnv.sh

Dweblogic.transaction.allowOverrideSetRollbackReason=true

を追加する必要がありました。この回答に感謝しますhttps://stackoverflow.com/a/38584687/1563286

関連する問題