メソッドにトランザクションを追加する場合、メソッドヘッダーに@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で新しいものをスローします