@Transactional註解詳細解讀

@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)

事物傳播行為介紹:

  • @Transactional(propagation=Propagation.REQUIRED) 如果有事務, 那麼加入事務, 沒有的話新建一個(默認)
  • @Transactional(propagation=Propagation.NOT_SUPPORTED) 容器不為這個方法開啟事務
  • @Transactional(propagation=Propagation.REQUIRES_NEW) 不管是否存在事務,都創建一個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務
  • @Transactional(propagation=Propagation.MANDATORY) 必須在一個已有的事務中執行,否則拋出異常
  • @Transactional(propagation=Propagation.NEVER) 必須在一個沒有的事務中執行,否則拋出異常(與Propagation.MANDATORY相反)
  • @Transactional(propagation=Propagation.SUPPORTS) 如果其他bean調用這個方法,在其他bean中聲明事務,那就用事務.如果其他bean沒有聲明事務,那就不用事務
  • isolation

    該屬性用於設置底層數據庫的事務隔離級別

    事務隔離級別介紹:

    1. @Transactional(isolation = Isolation.READ_UNCOMMITTED)讀取未提交數據(會出現髒讀, 不可重複讀) 基本不使用
    2. @Transactional(isolation = Isolation.READ_COMMITTED)讀取已提交數據(會出現不可重複讀和幻讀)
    3. @Transactional(isolation = Isolation.REPEATABLE_READ)可重複讀(會出現幻讀)
    4. @Transactional(isolation = Isolation.SERIALIZABLE)串行化

    什麼是髒讀、幻讀、不可重複讀?

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


    分享到:


    相關文章: