2017-09-28 4 views
0

は、それがサービスクラスで春JPAサービス - 検証 - 私はAPIを持つランタイム例外

@Transaction 
void method(){ 
try{ 
    service1.insertOne(); 
    service2.insertTwo(); 
} 
catch(Exception ex) { 
// log exception 
} 
} 

以下のように見える、私は一定の妥当性をチェックしていると私はRuntimeExceptionのサブクラスである例外をスローしています。この例外をスローすると、javax.persistence.RollbackException: Transaction marked as rollbackOnlyとなります。最初のサービスのデータが挿入されないようにしている間、2番目のサービスの検証が失敗しているので、これがこのシナリオを処理する正しい方法であるかどうかはかなり確信していません。

例外がサブクラスExceptionでない場合、service2の検証に失敗した場合でも、service1のデータが挿入されますが、カスタム例外がスローされて表示されます。だからどこが間違っているのか分からない。どんな助けもありがとうございます。

答えて

0

Spring Frameworkのトランザクションインフラストラクチャコードは、実行時、チェックされていない例外の場合にのみロールバックのトランザクションをマークします。つまり、スローされた例外がRuntimeExceptionのインスタンスまたはサブクラスである場合

https://docs.spring.io/spring/docs/current/spring-framework-reference/data-access.html#transaction-declarative-rolling-back

だから、それはRuntimeExceptionの種類として滞在する必要があります。

おそらくあなたはservice1.insertOneおよび/またはservice2.insertTwo()メソッドの上にTransactional注釈を持っていて、javax.persistence.RollbackException: Transaction marked as rollbackOnlyを得る理由です。

すでにアクティブなトランザクションがあるため、これらの追加の注釈(存在する場合)は必要ありません。

this answerをチェックしてください。

0

insertOneinsertTwoのメソッドが@Transactionalとマークされている場合、デフォルトの伝達はRequiredです。したがって、1つのトランザクションで実行されたすべてのものを表示する必要があります。 Link to docs

2番目のケースでは、同様に動作します。カスタムトランザクションを投げた場合、Springはそれを処理しません。そのデフォルト動作を更新するには、rollbackForを入力します。その場合、最初のケースとほぼ同じ状況が予想されます。

ですから、あなたの検証にトランザクションをrollbackOnlyとしてマークしたいのですか?私ははいと言うだろう。

おそらく質問が抽象的すぎます。請求書とポジションを入れているとします。このトランザクションがロールバックされると思います。しかし、あなたがグループとユーザーを追加すると...問題はユーザーであるため、グループに行くことができます。

0

私は、これは、このシナリオを処理するための正しい方法であれば、非常に、非常にわかりません。

YESこの方法は、あなたがトランザクションとしてあなたの方法void method()をマークすると、実行時例外があるたびに、ロールバックしてください指示し、罰金です。 @Transactionalアノテートされたメソッドを持つコードブロックが実行中にruntimeexceptionを観測すると、SpringフレームワークはThreadLocal変数の下にフラグ( 'rollbackOnly')を保持します。 method()の完了後、フラグ( 'rollbackOnly')がfalseであることがわかると、springはコミットすることに注意してください。それ以外の場合、springはトランザクションマネージャにすべての挿入をロールバックするよう指示します。

サービス2の検証に失敗した場合でも、service1のデータは挿入されますが、カスタム例外がスローされます。だからどこが間違っているのかわからない

上記のように、

関連する問題