記一次Spring Transactional註解事務失效問題定位

背景

     平臺功能,有插入數據部分丟失的情況;經初步定位是因爲多次入庫操作沒有在一個事務內進行

解決過程

     利用Spring transactional註解對service中操作入庫的操作方法添加註解;添加完成之後,測試發現,事務沒有生效。what?

然後進行事務沒有生效的原因定位;

1、檢查事務的傳播方式,項目默認的傳播行爲;

     項目的默認傳播行爲,PROPAGATION_REQUIRED,符合業務應用場景

2、經排查發現,有部分方法異常被catch住,沒有把異常拋出,導致不能檢查異常,從而不會回滾

     修改方法,把捕獲的異常重新拋出;測試發現,異常拋出後,事務仍然沒有生效,拋出異常後 ,DB依然沒有回滾,什麼情況?繼續排查

3、@Transactional 只對 public修飾上生效,其他修飾不起作用

     排查,沒有問題,所有的註解的方法都是public方法

4、默認情況下此註解會對unchecked異常進行回滾,對checked異常不回滾。

       所有如果想要對checked異常也進行事務回滾,需要制定transactional 回滾類型 rollback = Exception.class;  這樣,會對捕獲的所有異常都進行回滾;實測,依然不生效,此時,我心態有點不好了,哈哈,但是依然沒有放棄

5、 查看了一下配置文件,發現<tx:annotation-driven transaction-manager="TransactionManager" proxy-target-class="false"/>

   proxy-target-class 竟然設置成了false?這是誰幹的?出來,我要打人!因爲我們的平臺都是基於類代理的,沒有接口代理的情況,所以,我把proxy-target-class="false" 修改成proxy-target-class="true",我想,現在肯定沒問題了;測試,我靠,事務還是不生效;整個人已經很不好了

6、配置多個數據源的事務問題

     後來只能單步調試,調試中發現TransactionManager並不是我們定義的;原因終於找到了;原來是項目中用到了多個數據源,而配置多個數據源,事務會以加載的第一個數據源爲準;註解中用到的事務,默認都是生效在第一個數據源

解決方案:註解@Transactional時,如果指定默認事務處理器

指定之後默認事務處理器之後,事務總算是生效了;被一個很簡單的配置問題,搞得焦頭爛額,最後總算是解決了,還是很開心的;


 

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