spring聲明式事務失效

1.數據庫存儲引擎不支持事務

mysql的話innodb支持事務

2.沒有被spring容器管理

申明事務的類方法必須得假如spring容器,讓spring幫我們開啓事務

3. 數據源沒有配置事務管理器
4.在非public修飾的方法使用

@Transactional註解使用的是AOP,在使用動態代理的時候只能針對public方法進行代理

5.發生了自身調用

同一個類中,methodA 沒有設置事務,methodB 設置了事務,methodA 調用 methodB 時,事務失效;
我們知道,Spring之所以可以對開啓@Transactional的方法進行事務管理,是因爲Spring爲當前類生成了一個代理類,然後在運行相關方法時,會判斷這個方法有沒@Transactional註解,如果有的話,則會開啓一個事務。
其實現原理是 AOP , 而 AOP 的原理是動態代理 , 在自調用的過程中 , 是類自身的調用 ,而不是代理對象去調用, 那麼就不會產生 AOP , 這樣 Spring就不能把你的代碼織入到約定的流程中

6.異常被 catch 了

在業務代碼中一般不需要 catch 異常,如果非要 catch 一定要拋出 throw new RunTimeException()
,或註解中指定異常類型@Transactional(rollbackFor=Exception.class),否則會導致事務失效。

7.配置的傳播級別錯誤(propagation)
8.異常類型配置錯誤

@Transactional 的 rollbackFor 設置不正確

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章