面試突擊87:說一下 Spring 事務傳播機制?

Spring 事務傳播機制是指,包含多個事務的方法在相互調用時,事務是如何在這些方法間傳播的 。
既然是“事務傳播”,所以事務的數量應該在兩個或兩個以上,Spring 事務傳播機制的誕生是為了規定多個事務在傳播過程中的行為的 。比如方法 A 開啟了事務,而在執行過程中又調用了開啟事務的 B 方法,那么 B 方法的事務是應該加入到 A 事務當中呢?還是兩個事務相互執行互不影響,又或者是將 B 事務嵌套到 A 事務中執行呢?所以這個時候就需要一個機制來規定和約束這兩個事務的行為,這就是 Spring 事務傳播機制所解決的問題 。
Spring 事務傳播機制有哪些?Spring 事務傳播機制可使用 @Transactional(propagation=Propagation.REQUIRED) 來定義,Spring 事務傳播機制的級別包含以下 7 種:

  1. Propagation.REQUIRED:默認的事務傳播級別,它表示如果當前存在事務,則加入該事務;如果當前沒有事務 , 則創建一個新的事務 。
  2. Propagation.SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行 。
  3. Propagation.MANDATORY:(mandatory:強制性)如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常 。
  4. Propagation.REQUIRES_NEW:表示創建一個新的事務 , 如果當前存在事務 , 則把當前事務掛起 。也就是說不管外部方法是否開啟事務,Propagation.REQUIRES_NEW 修飾的內部方法會新開啟自己的事務 , 且開啟的事務相互獨立,互不干擾 。
  5. Propagation.NOT_SUPPORTED:以非事務方式運行 , 如果當前存在事務,則把當前事務掛起 。
  6. Propagation.NEVER:以非事務方式運行,如果當前存在事務,則拋出異常 。
  7. Propagation.NESTED:如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價于 PROPAGATION_REQUIRED 。
以上 7 種傳播機制,可根據“是否支持當前事務”的維度分為以下 3 類:
面試突擊87:說一下 Spring 事務傳播機制?

文章插圖
看到這里,有人可能會說:說了這么多 , 我也看不懂??,荚~箍炊?nbsp;, 我也記不住???这要咋整?
沒關系,接下來我們用一個例子 , 來說明這 3 類事務傳播機制的區別 。
以情侶之間是否要買房為例,我們將以上 3 類事務傳播機制可以看作是戀愛中的 3 類女生類型:
  • 普通型
  • 強勢型
  • 懂事型
這三類女生如下圖所示:
面試突擊87:說一下 Spring 事務傳播機制?

文章插圖
支持當前事務的“女生”,這里的事務指的是“房子” , 它分為 3 種(普通型女生):