@Transactional註解可以作用於接口、接口方法、類以及類方法上
1. 當作用於類上時,該類的所有 public 方法將都具有該類型的事務屬性
2. 當作用在方法級別時會覆蓋類級別的定義
3. 當作用在接口和接口方法時則只有在使用基於接口的代理時它才會生效,也就是JDK動態代理,而不是Cglib代理
4. 當在 protected、private 或者默認可見性的方法上使用 @Transactional 註解時是不會生效的,也不會拋出任何異常
5. 默認情況下,只有來自外部的方法調用才會被AOP代理捕獲,也就是,類內部方法調用本類內部的其他方法並不會引起事務行為,即使被調用方法使用@Transactional註解進行修飾
@Transactional註解的可用參數
readOnly
該屬性用於設置當前事務是否為只讀事務,設置為true表示只讀,false則表示可讀寫,默認值為false
rollbackFor
該屬性用於設置需要進行回滾的異常類數組,當方法中拋出指定異常數組中的異常時,則進行事務回滾。
例如: 1. 指定單一異常類:@Transactional(rollbackFor=RuntimeException.class)
2. 指定多個異常類:@Transactional(rollbackFor={RuntimeException.class, BusnessException.class})
rollbackForClassName
該屬性用於設置需要進行回滾的異常類名稱數組,當方法中拋出指定異常名稱數組中的異常時,則進行事務回滾。例如: 1. 指定單一異常類名稱:@Transactional(rollbackForClassName=“RuntimeException”) 2. 指定多個異常類名稱:@Transactional(rollbackForClassName={“RuntimeException”,“BusnessException”})
noRollbackFor
該屬性用於設置不需要進行回滾的異常類數組,當方法中拋出指定異常數組中的異常時,不進行事務回滾
timeout
該屬性用於設置事務的超時秒數,默認值為-1表示永不超時
propagation
該屬性用於設置事務的傳播行為 例如:@Transactional(propagation=Propagation.NOT_SUPPORTED)
事物傳播行為介紹:
isolation
該屬性用於設置底層數據庫的事務隔離級別
事務隔離級別介紹:
- @Transactional(isolation = Isolation.READ_UNCOMMITTED)讀取未提交數據(會出現髒讀, 不可重複讀) 基本不使用
- @Transactional(isolation = Isolation.READ_COMMITTED)讀取已提交數據(會出現不可重複讀和幻讀)
- @Transactional(isolation = Isolation.REPEATABLE_READ)可重複讀(會出現幻讀)
- @Transactional(isolation = Isolation.SERIALIZABLE)串行化
什麼是髒讀、幻讀、不可重複讀?
- 髒讀 : 一個事務讀取到另一事務未提交的更新數據
- 不可重複讀 : 在同一事務中, 多次讀取同一數據返回的結果有所不同, 換句話說, 後續讀取可以讀到另一事務已提交的更新數據. 相反, "可重複讀"在同一事務中多次讀取數據時, 能夠保證所讀數據一樣, 也就是後續讀取不能讀到另一事務已提交的更新數據
- 幻讀 : 一個事務讀到另一個事務已提交的insert數據
閱讀更多 程序界小哥 的文章