エラーのあるバッチ追加トランザクションロールバックの問題をキャッチしてみてください

メソッドにトランザクションを追加する場合、メソッドヘッダーに@Transactionalアノテーションを追加することがよくあります。

    @ResponseBody
    @RequestMapping(value = "/payment", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    @Transactional
    public Payment paymentJson(@RequestBody PaymentRequestInfo entity) {
    //method
  }

メソッドに属性のない@Transactionalアノテーションは、RuntimeExceptionまたはErrorがスローされた場合にのみトランザクションのロールバックをトリガーでき、一般的なnon-RuntimeExceptionはトランザクションのロールバックをトリガーしないことを見逃しがちです。

RuntimeException以外がスローされたときにロールバックメカニズムをトリガーする場合は、アノテーションにrollbackFor = {Exception.class}属性を追加する必要があります。

    @ResponseBody
    @RequestMapping(value = "/payment", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    @Transactional(rollbackFor = { Exception.class })
    public Payment paymentJson(@RequestBody PaymentRequestInfo entity) {
     //method
    }

もちろん、上記のトランザクションロールバックの前提は、@ Transactionalアノテーションメソッドに例外をキャッチするためのtry {...} catch {...}が含まれていないため、プログラム操作中の例外がスムーズにスローされ、トランザクションがトリガーされることです。ロールバック。

実際の開発では、例外を判断してクライアントに迅速な情報を返すために、メソッドで例外をキャプチャする必要があることがよくあります。ただし、この時点では、例外がキャッチされたため、トランザクションのロールバックはトリガーされず、トランザクションが失敗しました。

以下にいくつかの解決策を示します。

1. @Transactionalアノテーションを使用して、@ Transactionalアノテーションによってデフォルトで認識されるRuntimeExceptionをスローします

@Transactionalアノテーションがメソッドで使用され、例外がキャッチされると、RuntimeExceptionがcatchステートメントでスローされます。

2. @Transactional(rollbackFor = {Exception.class})を使用して、キャプチャされた非RuntimeException例外をスローします

このメソッドは、@ Transactional(rollbackFor = {Exception.class})アノテーションを使用して、トランザクションのロールバックレベルを宣言します。例外がキャッチされると、キャッチされた例外がcatchステートメントで直接スローされます。

3.手動ロールバック

上記の2つのcatch {...}で例外をスローする方法には欠点があります。つまり、catch {...}にreturn句を含めることができないため、手動ロールバックを設定します。例外がキャッチされた場合は、手動でロールバックして同時にフォアグラウンドプロンプトメッセージに戻ります。

try catchでトランザクションを手動でロールバックする必要があります。TransactionalとTransactionAspectSupport.currentTransactionStatus()。setRollbackOnly();を使用してください。 

または、例外クラスをカスタマイズして、trycatchで新しいものをスローします

おすすめ

転載: blog.csdn.net/qq_39008613/article/details/105096612