事務管理@Transactional

傳播行爲(生命週期)-Propagation

所謂事務的傳播行爲是指,若是在開始當前事務以前,一個事務上下文已經存在,此時有若干選項能夠指定一個事務性方法的執行行爲(org.springframework.transaction.annotation.Propagation)
  • REQUIRED(默認)

方法A調用時沒有事務新建一個事務,當在方法A調用另外一個方法B的時候,方法B將使用同一個事務;若是方法B發生異常須要數據回滾的時候,整個事務回滾spring

  • REQUIRED_NEW

對於方法A與B,在方法調用的時候不管是否有事務,都要開啓一個新的事;若是這樣方法B有異常不會致使方法A的數據回滾sql

  • NESTED

和REQUIRED_NEW相似,但支持JDBC,不支持JPA或者Hibernate數據庫

  • SUPPORTS

方法調用時有事務就用事務,沒有就不用併發

  • NOT_SUPPORTS

強制方法不在事務中執行,如有事務,在方法調用到結束階段事務都將會被掛起code

  • NEVER

強制方法不在事務中執行,如有事務則拋出異常生命週期

  • MANDATORY

強制方法在事務中執行,若無事務則拋出異常
指定方法:經過使用propagation屬性設置事務

@Transactional(propagation = Propagation.REQUIRED)

隔離級別-Isolation

隔離級別是指若干個併發的事務之間的隔離程度,與咱們開發時候主要相關的場景包括:髒讀取、重複讀、幻讀;
Isolation(隔離)決定了事務的完整性,處理在多事務對相同數據下的處理機制
  • READ_UNCOMMITED

對於在A事務裏修改了一條記錄但沒有提交事務,在B事務能夠讀取到修改後的記錄。可致使髒讀,不可重複讀以及幻讀開發

  • READ_COMMITED

只有當在A事務裏修改了一條記錄且提交記錄以後,B事務才能夠讀取到提交後的記錄;阻止髒讀,但可能致使不可重複讀和幻讀io

  • REPEATABLE_READ

不只能實現READ_COMMITED的功能,並且還能阻止當A事務讀取了一條記錄,B事務將不容許修改這條記錄;阻止髒讀和不可重複讀,但可出現幻讀class

  • SERIALIZABLE

此級別下事務是順序執行的,能夠避免上述級別的缺陷,但開銷較大

  • DEFAULT(默認)

使用當前數據庫的默認隔離界級別,如Oracle、SqlServer是READ_COMMITED;Mysql是REPEATABLE_READ
指定方法:經過使用isolation屬性設置

@Transactional(isolation = Isolation.DEFAULT)

timeout(默認TIMEOUT_DEFAULT)

timeout指定事務過時時間,默認爲當前數據庫的事務過時時間

readonly(默認false)

指定當前事務是不是隻讀事務

rollbackFor(默認Throwable的子類)

指定哪一個或者哪些異常能夠引發事務回滾

noRollBackFor(默認Throwable的子類)

指定哪一個或者哪些異常不能夠引發事務回滾

@Transactional(propagation=Propagation.REQUIRED)           //控制事務傳播。默認是Propagation.REQUIRED
@Transactional(isolation=Isolation.DEFAULT)                //控制事務隔離級別。默認跟數據庫的默認隔離級別相同
@Transactional(readOnly=false)                             //控制事務可讀寫仍是隻可讀。默承認讀寫
@Transactional(timeout=30)                                 //控制事務的超時時間,單位秒。默認跟數據庫的事務控制系統相同,又說是30秒
@Transactional(rollbackFor=RuntimeException.class)         //控制事務遇到哪些異常纔會回滾。默認是RuntimeException
@Transactional(rollbackForClassName=RuntimeException)      //同上
@Transactional(noRollbackFor=NullPointerException.class)   //控制事務遇到哪些異常不會回滾。默認遇到非RuntimeException不會回滾
@Transactional(noRollbackForClassName=NullPointerException)//同上
相關文章
相關標籤/搜索