(spring)嵌套事務邏輯分析

  • 2019 年 10 月 5 日
  • 筆記

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/qq_37933685/article/details/82635037

個人博客:https://suveng.github.io/blog/​​​​​​​

事務傳播行為

所謂事務的傳播行為是指,如果在開始當前事務之前,一個事務上下文已經存在,此時有若干選項可以指定一個事務性方法的執行行為。在TransactionDefinition定義中包括了如下幾個表示傳播行為的常量:

名稱

作用

PROPAGATION_REQUIRED

如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。

PROPAGATION_SUPPORTS

支持當前事務,如果當前沒有事務,就以非事務方式執行。

PROPAGATION_MANDATORY

使用當前的事務,如果當前沒有事務,就拋出異常。

PROPAGATION_REQUIRES_NEW

新建事務,如果當前存在事務,把當前事務掛起。

PROPAGATION_NOT_SUPPORTED

以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

PROPAGATION_NEVER

以非事務方式執行,如果當前存在事務,則拋出異常。

PROPAGATION_NESTED

如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。

嵌套事務邏輯分析

  1. 外部事務成功 -> 外部事務成功,子事務可能提交可能回滾
    1. 子事務 失敗, 回滾到保存點savepoint,需要捕獲異常處理,如果不捕獲,throw到外部事務,則外部事務不會成功提交
    2. 子事務 成功 提交
  2. 外部事務 失敗 ->外部事務回滾,子事務回滾 ​ 1. 子事務 必定回滾
    1. 子事務成功
    2. 子事務失敗