spring中的七種事務傳播機制

事務傳播行為類型說明

PROPAGATION_REQUIRED

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

PROPAGATION_SUPPORTS

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

PROPAGATION_MANDATORY

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

PROPAGATION_REQUIRES_NEW

<code>新建事務,如果當前存在事務,把當前事務掛起。/<code>

PROPAGATION_NOT_SUPPORTED

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

PROPAGATION_NEVER

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

PROPAGATION_NESTED

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

REQUIRED

Propagation.REQUIRED 修飾的內部方法和外圍方法用的是一個事務。 只要一個事務回滾,整個事務就會回滾。

SUPPORTS

REQUIRED 和 SUPPORTS在外圍方法支持事務的時候沒有區別,均加入外圍方法的事務中。

<code>// 當外圍方法不支持事務,REQUIRED開啟新的事務而SUPPORTS不開啟事務。 ​
 // REQUIRED的事務一定和外圍方法事務統一。如果外圍方法沒有事務,每一個內部REQUIRED方法都會開啟一個新的事務,互不干擾。/<code>

NOT_SUPPORTED

明確表示不開啟事務。

REQUIRES_NEW

無論外圍方法是否開啟事務,內部REQUIRES_NEW方法均會開啟獨立事務,且和外圍方法也不在同一個事務中,內部方法和外圍方法、內部方法之間均不相互干擾。

// 當外圍方法不開啟事務的時候,REQUIRED和REQUIRES_NEW標註的內部方法效果相同。

MANDATORY

只要外圍沒有事務就會直接拋出異常,具體插入方法都沒有機會執行。

外圍方法開啟事務,內部MANDATORY方法都加入外圍方法事務,外圍方法拋出異常,事務回滾.。 內部方法拋出異常,事務也會回滾。

NEVER

外圍方法開啟事務。內部方法執行的時候因外圍有事務而直接拋出異常,都沒有機會執行。

NESTED

在外圍方法未開啟事務的情況下Propagation.NESTED 和 Propagation.REQUIRED 作用相同,修飾的內部方法都會新開啟自己的事務,且開啟的事務相互獨立,互不干擾。

外圍方法開啟事務,內部事務為外圍事務的子事務,內部方法拋出異常回滾,且外圍方法感知異常致使整體事務回滾。 但是內部外部方法拋出異常,不會影響到內部方法的執行


在外圍方法開啟事務的情況下Propagation.NESTED修飾的內部方法屬於外部事務的子事務,外圍主事務回滾,子事務一定回滾,而內部子事務可以單獨回滾而不影響外圍主事務和其他子事務


事務的可見性

<code>對於REQUIRES_NEW和NOT_SUPPORTED傳播屬性,在外圍方法開啟事務,均不可見外圍事務執行結果。
//對於REQUIREED和NESTED傳播屬性,無論外圍方法是否開啟事務,均可見外圍方法執行結果。  /<code>


重點:

<code>//NESTED和REQUIRED修飾的內部方法都屬於外圍方法事務,如果外圍方法拋出異常,這兩種方法的事務都會被回滾。
//但是REQUIRED是加入外圍方法事務,所以和外圍事務同屬於一個事務,所以一旦REQUIRED事務拋出異常被回滾,外圍方法事務也將被回滾
//而NESTED是外圍方法的子事務,有單獨的保存點,所以NESTED方法拋出異常被回滾,不會影響到外圍方法的事務。
​
//NESTED和REQUIRES_NEW都可以做到內部方法事務回滾但是不影響外圍方法事務。
//但是因為NESTED是嵌套事務,所以外圍方法回滾之後,作為外圍方法事務的子事務也會被回滾。
//而REQUIRES_NEW是通過開啟新的事務實現的,內部事務和外圍事務是兩個事務,外圍事務回滾不會影響內部事務。/<code> 


分享到:


相關文章: