@Transactional聲明式事務是基于AOP的
而AOP是基于動態(tài)代理實現(xiàn)的
所以不想要讓事務失效,就要使用代理對象的方法
所以問題就是什么情況下他不會走到代理對象的方法
1.同一個類當中的方法調用
不管你是調用的公有方法還是私有方法他都是通過this調用的真實對象不會走到代理的
2.調用的是static方法
因為這種方法他是屬于類的,并不是某個對象的,所以他是無法被代理對象調用的
3.final方法也是無法走代理的
因為aop創(chuàng)建的代理對象無法對final方法進行子類化和覆蓋,所以無法攔截這些方法的
除此之外,失效還可能和Transactional中注解的兩個屬性有關
一個是propagation 一個是rollbackFor
propagation設置錯誤,比如說設置成了 not_supported 那么事務肯定是會失效的
而rollbackFor 他默認只處理RuntimeException的,如果發(fā)生了別的異常,事務是不會回滾的,所以需要特別注意,我們需要手動設置為 Exception
另外如果異常唄捕獲了,不管是方法內部捕獲了,還是別的切面優(yōu)先給捕獲了,都是不會回滾的