天天看點

@Tranactional 注解分析

Spring可以通過注解@Transactional來為業務邏輯層的方法(調用DAO完成持久化動作)添加事務能力,如下是@Transactional注解的定義

@Tranactional注解分析

  • 作用域:Transactional作用于類上表示類上所有的方法使用指定的事務管理政策,作用于方法表示該方法使用指定的事務管理政策;如果方法和類同時定義了@Tranactional注解,那麼方法上定義的@Tranactional的屬性覆寫類上定義的@Tranactional的屬性
  • value: 用于比對Spring中定義的tranactionManager的名字,預設是Spring中名稱為transactionManager的事務管理器。當配置了多個事務管理器時,可以使用該屬性指定選擇哪個事務管理器
  • propagation:事務傳播屬性,預設是Propagation.REQUIRED。可選的值有:

    Propagation.REQUIRED

    如果目前存在事務,則加入該事務,如果目前不存在事務,則建立一個新的事務。

    Propagation.SUPPORTS

    如果目前存在事務,則加入該事務;如果目前不存在事務,則以非事務的方式繼續運作。

    Propagation.MANDATORY

    如果目前存在事務,則加入該事務;如果目前不存在事務,則抛出異常。

    Propagation.REQUIRES_NEW

    重新建立一個新的事務,如果目前存在事務,暫停目前的事務。

    Propagation.NOT_SUPPORTED

    以非事務的方式運作,如果目前存在事務,暫停目前的事務。

    Propagation.NEVER

    以非事務的方式運作,如果目前存在事務,則抛出異常。

    Propagation.NESTED 和 Propagation.REQUIRED 效果一樣。

  • isolation:事務隔離級别,預設是Isolation.DEFAULT,它是指資料庫的預設隔離級别可選的值有:

    Isolation.DEFAULT

    使用底層資料庫預設的隔離級别。

    Isolation.READ_UNCOMMITTED

    Isolation.READ_COMMITTED

    Isolation.REPEATABLE_READ

    Isolation.SERIALIZABLE

  • timeout:事務逾時時間,預設是TransactionDefinition.TIMEOUT_DEFAULT,它是指資料庫的預設的事務逾時時間。預設值為-1,如果超過該時間限制但事務還沒有完成,則自動復原事務。
參 數 名 稱 功 能 描 述
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表示永不逾時

注意:

1. 一般情況下我們在處理具體的業務都是在Service層來進行處理操作,此時如果在Service類上添加@Transactional注解的話,那麼Service曾的每一個業務方法調用的時候都會打開一個事務。

2. Spring預設情況下會對(RuntimeException)及其子類來進行復原,在遇見Exception及其子類的時候則不會進行復原操作。

3. @Transactional既可以作用于接口,接口方法上以及類已經類的方法上。但是Spring官方不建議接口或者接口方法上使用該注解,因為這隻有在使用基于接口的代理時它才會生效。另外, @Transactional 注解應該隻被應用到 public 方法上,這是由 Spring AOP 的本質決定的。如果你在 protected、private 或者預設可見性的方法上使用 @Transactional 注解,這将被忽略,也不會抛出任何異常。 Spring預設使用的是jdk自帶的基于接口的代理,而沒有使用基于類的代理CGLIB。

4.  @Transactional注解底層使用的是動态代理來進行實作的,如果在調用本類中的方法,此時不添加@Transactional注解,而是在調用類中使用thisi調用本類中的另外一個添加了@Transactional注解,此時this調用的方法上的@Transactional注解是不起作用的。