Spring對於事務的管理
前言:Spring對於事務的管理提供了兩種型別的事務管理。
- 程式設計式事務————通過Transaction Template手動管理事務,因為與業務程式碼具有一定的耦合性質,在做改動的時候勢必會牽連到主業務,所以實際應用中很少使用。
- 宣告式事務————使用XML配置宣告式事務: 推薦使用(程式碼侵入性最小),實際是通過AOP實現。
1. 宣告式事務
1.1 XML方式
其最大特點是與 Spring AOP 結合緊密,實際用的是AspectJ實現,可以充分利用切點表示式的強大支援,使得管理事務更加靈活。
是基於< tx> 和< aop>名稱空間的宣告式事務管理。
1.2 註解方式
@Transactional 註解可以被應用於介面定義和介面方法、類定義和類的public 方法上。
@Transactional 註解只能應用到 public 可見度的方法上。如果你在 protected、private 或者package-visible 的方法上使用@Transactional 註解,它也不會報錯,但是這個被註解的方法將不會展示已配置的事務設定【即不會生效】。
使用@Transactional注意點:
- 如果在介面、實現類或方法上都指定了@Transactional 註解,則優先順序順序為方法>實現類>介面;
- 建議只在實現類或實現類的方法上使用@Transactional,而不要在介面上使用,這是因為如果使用JDK代理機制(基於介面的代理)是沒問題;而使用使用CGLIB代理(繼承)機制時就會遇到問題,因為其使用基於類的代理而不是介面,這是因為介面上的@Transactional註解是“不能繼承的”;
@Transactional屬性介紹
屬性 | 型別 | 描述 |
---|---|---|
value | String | 可選的限定描述符,指定使用的事務管理器 |
propagation | enum: Propagation | 可選的事務傳播行為設定 |
isolation | enum: Isolation | 可選的事務隔離級別設定 |
readOnly | boolean | 讀寫或只讀事務,預設讀寫 |
timeout | int (in seconds granularity) | 事務超時時間設定 |
rollbackFor | Class物件陣列,必須繼承自Throwable | 導致事務回滾的異常類陣列 |
rollbackForClassName | 類名陣列,必須繼承自Throwable | 導致事務回滾的異常類名字陣列 |
noRollbackFor | Class物件陣列,必須繼承自Throwable | 不會導致事務回滾的異常類陣列 |
noRollbackForClassName | 類名陣列,必須繼承自Throwable | 不會導致事務回滾的異常類名字陣列 |
- propagation 代表事務的傳播行為,預設值為 Propagation.REQUIRED
- isolation :事務的隔離級別,預設值為 Isolation.DEFAULT
- timeout :事務的超時時間,預設值為 -1。如果超過該時間限制但事務還沒有完成,則自動回滾事務
- readOnly :指定事務是否為只讀事務,預設值為 false;為了忽略那些不需要事務的方法,比如讀取資料,可以設定 read-only 為 true
- rollbackFor :用於指定能夠觸發事務回滾的異常型別,可以指定多個異常型別
- noRollbackFor:丟擲指定的異常型別,不回滾事務,也可以指定多個異常型別
事務傳播行為介紹
原文:https://blog.csdn.net/weixin_39625809/article/details/80707695
原文:https://blog.csdn.net/pml18710973036/article/details/58607148
傳播行為:指的就是當一個事務方法被另一個事務方法呼叫時,這個事務方法應該如何進行。
隔離級別介紹
原文:https://zhuanlan.zhihu.com/p/112183409
原文:https://www.cnblogs.com/yangqiong1989/p/6882625.html
原文:https://blog.csdn.net/qq_37651267/article/details/92425172
事務失效
原文:https://baijiahao.baidu.com/s?id=1661650900351466294&wfr=spider&for=pc
原文:https://zhuanlan.zhihu.com/p/114461128
總結:
- 在同一個類中,沒有@Transactional註解的方法去呼叫有@Transactional註解
- @Transactional 應用在非 public 修飾的方法上
- @Transactional 註解屬性 propagation 設定錯誤
- 異常被你的 catch“吃了”導致@Transactional失效
- 資料庫引擎不支援事務
- @Transactional 註解屬性 rollbackFor 設定錯誤--丟擲的異常為checked型別
rollbackFor 可以指定能夠觸發事務回滾的異常型別。Spring預設丟擲了未檢查unchecked異常(繼承自 RuntimeException 的異常)或者 Error才回滾事務;其他異常不會觸發回滾事務。如果在事務中丟擲其他型別的異常,但卻期望 Spring 能夠回滾事務,就需要指定 rollbackFor屬性。