1. 程式人生 > 實用技巧 >Spring :事務傳播行為

Spring :事務傳播行為

一.相關定義

事務傳播行為(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感知到異常就一定會回滾。

傳播行為總是來定義:當一個事務存在時,它內部的事務該怎樣執行。