Spring :事務傳播行為
阿新 • • 發佈:2020-09-03
一.相關定義
事務傳播行為(propagation):當前方法的事務如何傳播下去(裡面的方法如果用事務,是否與它公用一個事務)
spring中有其中有7種事務傳播行為,預設是Reqiured級別。
public enum Propagation { /** * Support a current transaction, create a new one if none exists. 如果以前有事務,就用以前的事務,如果沒有,就建立一個新的事務。 */ REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED), /** * Support a current transaction, execute non-transactionally if none exists. 支援新的事務,如果沒有事務,也可以執行 */ SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS), /** * Support a current transaction, throw an exception if none exists. 當前必須存在事務,否則拋異常 */ MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY), /** * Create a new transaction, and suspend the current transaction if one exists. 建立一個新的事務,並且掛起以前舊的事務 */ REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW), /** * Execute non-transactionally, suspend the current transaction if one exists. 不支援當前存在事務,如果有就掛起當前事務 */ NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED), /** * Execute non-transactionally, throw an exception if a transaction exists. 不支援當前存在事務,如果有就拋異常。 */ NEVER(TransactionDefinition.PROPAGATION_NEVER), /** * Execute within a nested transaction if a current transaction exists,
開啟一個子事務,mysql不支援,只有支援還原點功能的資料庫才行(oracle) */ NESTED(TransactionDefinition.PROPAGATION_NESTED); private final int value; Propagation(int value) { this.value = value; } public int value() { return this.value; } }
二.相關場景(常用的只有required和requires_new)
下面針對這兩個構建相關場景:
外事務 {
A()REQUIRED
B()REQUIRES_NEW
C()REQUIRED
D()REQUIRES_NEW
//外----
}
場景1:A方法出現異常,由於異常機制,導致程式碼停止,資料庫沒有任何新的資料進入
場景2:C方法出現異常,A回滾,B成功,C回滾,D和外無法執行
場景3:外執行成功後,又丟擲異常。外事務感知到異常,A,C,外回滾,B,D成功。
場景4:D異常,A,C回滾,外執行不了,B成功,D自己回滾
場景5:C用try-catch執行,C出現異常回滾,外界沒有感知到異常,A,B,D,外都成功。
總結:傳播行為過程中,只要requires_new被執行過,就一定成功,required感知到異常就一定會回滾。
傳播行為總是來定義:當一個事務存在時,它內部的事務該怎樣執行。