1. 程式人生 > 其它 >Spring對於事務的管理

Spring對於事務的管理

前言:Spring對於事務的管理提供了兩種型別的事務管理。

  1. 程式設計式事務————通過Transaction Template手動管理事務,因為與業務程式碼具有一定的耦合性質,在做改動的時候勢必會牽連到主業務,所以實際應用中很少使用。
  2. 宣告式事務————使用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屬性。