spring事務失效的幾種常見情況

1、spring的事務註解@Transactional只能放在public修飾的方法上才起作用,如果放在其他非public(private,protected)方法上,雖然不報錯,但是事務不起作用

2、如果採用spring+spring mvc,則context:component-scan重複掃描問題可能會引起事務失敗。 

        如果spring和mvc的配置文件中都掃描了service層,那麼事務就會失效。

       原因:因爲按照spring配置文件的加載順序來講,先加載springmvc配置文件,再加載spring配置文件,我們的事物一般都在srping配置文件中進行配置,如果此時在加載srpingMVC配置文件的時候,把servlce也給註冊了,但是此時事物還沒加載,也就導致後面的事物無法成功注入到service中。所以把對service的掃描放在spring配置文件中或是其他配置文件中。
3、如使用mysql且引擎是MyISAM,則事務會不起作用,原因是MyISAM不支持事務,可以改成InnoDB引擎

4、在業務代碼中如果拋出RuntimeException異常,事務回滾;但是拋出Exception,事務不回滾;

      解決方法@Transactional改爲@Transactional(rollbackFor = Exception.class)

5、如果在加有事務的方法內,使用了try...catch..語句塊對異常進行了捕獲,而catch語句塊沒有throw  new RuntimeExecption異常,事務也不會回滾

6、在類A裏面有方法a 和方法b, 然後方法b上面用 @Transactional加了方法級別的事務,在方法a裏面 調用了方法b, 方法b裏面的事務不會生效。原因是在同一個類之中,方法互相調用,切面無效 ,而不僅僅是事務。這裏事務之所以無效,是因爲spring的事務是通過aop實現的。
 

發佈了51 篇原創文章 · 獲贊 21 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章