Spring 事務管理

Spring兩種事務處理機制

聲明式事務數據庫

Spring的聲明式事務管理在底層是創建在AOP的基礎之上的。其 本質是對方法先後進行攔截,而後在目標方法開始以前建立或者加入一個事務,在執行完目標方法以後根據執行狀況提交或者回滾事務。聲明式事務最大的優勢就是不須要經過編程的方式管理事務,這樣就不須要在業務邏輯代碼中摻瑣事務管理的代碼,只需在配置文件中作相關的事務規則聲明(或經過等價的基於標註的方式),即可以將事務規則應用到業務邏輯中。由於事務管理自己就是一個典型的橫切邏輯,正是AOP的用武之地。Spring開發團隊也意識到了這一點,爲聲明式事務提供了簡單而強大的支持。Spring強大的聲明式事務管理功能,這主要得益於Spring依賴注入容器和Spring AOP的支持。依賴注入容器爲聲明式事務管理提供了基礎設施,使得Bean對於Spring框架而言是可管理的;而Spring AOP則是聲明式事務管理的直接實現者。和編程式事務相比,聲明式事務惟一不足地方是,後者的最細粒度只能做用到方法級別,沒法作到像編程式事務那樣能夠做用到代碼塊級別。可是即使有這樣的需求,也存在不少變通的方法,好比,能夠將須要進行事務管理的代碼塊獨立爲方法等等編程

事務傳播行爲介紹:

@Transactional(propagation=Propagation.REQUIRED) 果有事務, 那麼加入事務, 沒有的話新建一個(默認狀況下)數組

@Transactional(propagation=Propagation.NOT_SUPPORTED) 容器不爲這個方法開啓事務併發

@Transactional(propagation=Propagation.REQUIRES_NEW) 不論是否存在事務,都建立一個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務框架

@Transactional(propagation=Propagation.MANDATORY) 必須在一個已有的事務中執行,不然拋出異常code

@Transactional(propagation=Propagation.NEVER) 必須在一個沒有的事務中執行,不然拋出異常(與Propagation.MANDATORY相反)事務

@Transactional(propagation=Propagation.SUPPORTS) 若是其餘bean調用這個方法,在其餘bean中聲明事務,那就用事務.若是其餘bean沒有聲明事務,那就不用事務.開發

事務超時設置:

@Transactional(timeout=30) : 30秒事務超時io

事務隔離級別:

@Transactional(isolation = Isolation.READ_UNCOMMITTED) 讀取未提交數據(會出現髒讀, 不可重複讀) 基本不使用class

@Transactional(isolation = Isolation.READ_COMMITTED) 讀取已提交數據(會出現不可重複讀和幻讀)

@Transactional(isolation = Isolation.REPEATABLE_READ) 可重複讀(會出現幻讀)

@Transactional(isolation = Isolation.SERIALIZABLE) 串行化

注意

MYSQL: 默認爲 REPEATABLE_READ 級別 SQLSERVER: 默認爲 READ_COMMITTED 級別

髒讀 : 一個事務讀取到另外一事務未提交的更新數據

不可重複讀 : 在同一事務中, 屢次讀取同一數據返回的結果有所不一樣, 換句話說, 後續讀取能夠讀到另外一事務已提交的更新數據. 相反, "可重複讀"在同一事務中屢次 讀取數據時, 可以保證所讀數據同樣, 也就是後續讀取不能讀到另外一事務已提交的更新數據

幻讀 : 一個事務讀到另外一個事務已提交的insert數據

@Transactional 註解中經常使用參數說明

readOnly : 該屬性用於設置當前事務是否爲只讀事務,設置爲true表示只讀,false則表示可讀寫,默認值爲false。
		例如:@Transactional(readOnly=true)

rollbackFor : 該屬性用於設置須要進行回滾的異常類數組,當方法中拋出指定異常數組中的異常時,則進行事務回滾。
		例如:
		指定單一異常類:@Transactional(rollbackFor=RuntimeException.class)
		指定多個異常類:@Transactional(rollbackFor={RuntimeException.class, Exception.class})


rollbackForClassName :該屬性用於設置須要進行回滾的異常類名稱數組,當方法中拋出指定異常名稱數組中的異常時,則進行事務回滾。
		例如:
		指定單一異常類名稱:@Transactional(rollbackForClassName="RuntimeException")
		指定多個異常類名稱:@Transactional(rollbackForClassName={"RuntimeException","Exception"})

noRollbackFor : 該屬性用於設置不須要進行回滾的異常類數組,當方法中拋出指定異常數組中的異常時,不進行事務回滾。
		例如:
		指定單一異常類:@Transactional(noRollbackFor=RuntimeException.class)
		指定多個異常類:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})

noRollbackForClassName : 該屬性用於設置不須要進行回滾的異常類名稱數組,當方法中拋出指定異常名稱數組中的異常時,不進行事務回滾。
		例如:
		指定單一異常類名稱:@Transactional(noRollbackForClassName="RuntimeException")
		指定多個異常類名稱:@Transactional(noRollbackForClassName={"RuntimeException","Exception"})

propagation : 該屬性用於設置事務的傳播行爲。
		例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)

isolation :該屬性用於設置底層數據庫的事務隔離級別,事務隔離級別用於處理多事務併發的狀況,一般使用數據庫的默認隔離級別便可,基本不須要進行設置

timeout :該屬性用於設置事務的超時秒數,默認值爲-1表示永不超時

注意:

@Transactional只能被應用到public方法上, 對於其它非public的方法,若是標記了 @Transactional 也不會報錯,但方法沒有事務功能.

相關文章
相關標籤/搜索