事務傳播行為類型說明
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>