所謂事務的傳播行爲是指,若是在開始當前事務以前,一個事務上下文已經存在,此時有若干選項能夠指定一個事務性方法的執行行爲(org.springframework.transaction.annotation.Propagation)
方法A調用時沒有事務新建一個事務,當在方法A調用另外一個方法B的時候,方法B將使用同一個事務;若是方法B發生異常須要數據回滾的時候,整個事務回滾spring
對於方法A與B,在方法調用的時候不管是否有事務,都要開啓一個新的事;若是這樣方法B有異常不會致使方法A的數據回滾sql
和REQUIRED_NEW相似,但支持JDBC,不支持JPA或者Hibernate數據庫
方法調用時有事務就用事務,沒有就不用併發
強制方法不在事務中執行,如有事務,在方法調用到結束階段事務都將會被掛起code
強制方法不在事務中執行,如有事務則拋出異常生命週期
強制方法在事務中執行,若無事務則拋出異常
指定方法:經過使用propagation屬性設置事務
@Transactional(propagation = Propagation.REQUIRED)
隔離級別是指若干個併發的事務之間的隔離程度,與咱們開發時候主要相關的場景包括:髒讀取、重複讀、幻讀;
Isolation(隔離)決定了事務的完整性,處理在多事務對相同數據下的處理機制
對於在A事務裏修改了一條記錄但沒有提交事務,在B事務能夠讀取到修改後的記錄。可致使髒讀,不可重複讀以及幻讀開發
只有當在A事務裏修改了一條記錄且提交記錄以後,B事務才能夠讀取到提交後的記錄;阻止髒讀,但可能致使不可重複讀和幻讀io
不只能實現READ_COMMITED的功能,並且還能阻止當A事務讀取了一條記錄,B事務將不容許修改這條記錄;阻止髒讀和不可重複讀,但可出現幻讀class
此級別下事務是順序執行的,能夠避免上述級別的缺陷,但開銷較大
使用當前數據庫的默認隔離界級別,如Oracle、SqlServer是READ_COMMITED;Mysql是REPEATABLE_READ
指定方法:經過使用isolation屬性設置
@Transactional(isolation = Isolation.DEFAULT)
timeout指定事務過時時間,默認爲當前數據庫的事務過時時間
指定當前事務是不是隻讀事務
指定哪一個或者哪些異常能夠引發事務回滾
指定哪一個或者哪些異常不能夠引發事務回滾
@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)//同上