2017-07-19 18 views
1

私のgrailsアプリケーションで私は頻繁に取得org.springframework.transaction.HeuristicCompletionException:ヒューリスティック完了:結果の状態がロールバックされます。入れ子になった例外はorg.springframework.transaction.UnexpectedRollbackExceptionです。トランザクションはロールバック専用としてマークされているためロールバックされます。私は何らかの形で@Transactionalによって注釈が付けられたメソッドの内部で何らかの例外が発生し、それ自身の@Transactionalを持つメソッドの中で呼び出されたときにこれが起こることを発見しました。私のクエリはこの例外を単に捕まえて無視することができますか?GrailsのHeuristicCompletionExceptionを単純に無視できますか?

+0

トランザクションはあなたの側から何もしてロールバックされません。 –

+0

この問題はランダムに発生しています。一時的な問題によってトランザクションがロールバックされている可能性があります。これは次回のログイン時に修正されますが、例外で生成された電子メールをこの例外でトリガーする必要はありません。 –

+0

何が起こっているかは、ネストされたメソッド呼び出しの1つがチェックされていない例外をスローするため、トランザクションがロールバックのみとしてマークされます。そしてあなたのコードが例外をキャッチしているところを呼び出します。しかし、トランザクションはロールバックのみとしてマークされており、このUnexpectedRollbackExceptionエラーが表示されます。チェックされていない例外がトランザクションメソッドを越えていないか、その前にキャッチするか、元の例外をすべて伝えるか、このUnexpectedRollbackExceptionを無視してください。 –

答えて

1

私はコメントのSudhirが示唆するように、ヒューリスティックな完了問題をメソッドの1つに複製でき、新しいトランザクション/メソッドを作成するサービスによって既存のトランザクションの使用をロールバックしないことがわかりましたよう:@Transactional(伝播= PROPAGATION.REQUIRES_NEW)をアノテート

@Transactional 
Class MyService { 
@Transactional(propagation = PROPAGATION.REQUIRES_NEW) 
def myMethod(){ 
throw new Exception(); 
} 
} 

これは方法のために新しいトランザクションを作成し、既存のトランザクションを中断します。メソッドが実行されるたびに新しいトランザクションが作成されるため、巨大なマルチスレッドアプリケーションのパフォーマンス上の問題となるはずです。サービスクラス内の各メソッドで発生するすべての例外を処理することでこれを軽減しました。これは良いでしょう。

関連する問題