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註解是不起作用的。
參考部落格:https://blog.csdn.net/m0_37779570/article/details/81352587、
https://www.jianshu.com/p/f80274bc6918