@Transactional声明式事务是基于AOP的
而AOP是基于动态代理实现的
所以不想要让事务失效,就要使用代理对象的方法
所以问题就是什么情况下他不会走到代理对象的方法
1.同一个类当中的方法调用
不管你是调用的公有方法还是私有方法他都是通过this调用的真实对象不会走到代理的
2.调用的是static方法
因为这种方法他是属于类的,并不是某个对象的,所以他是无法被代理对象调用的
3.final方法也是无法走代理的
因为aop创建的代理对象无法对final方法进行子类化和覆盖,所以无法拦截这些方法的
除此之外,失效还可能和Transactional中注解的两个属性有关
一个是propagation 一个是rollbackFor
propagation设置错误,比如说设置成了 not_supported 那么事务肯定是会失效的
而rollbackFor 他默认只处理RuntimeException的,如果发生了别的异常,事务是不会回滚的,所以需要特别注意,我们需要手动设置为 Exception
另外如果异常呗捕获了,不管是方法内部捕获了,还是别的切面优先给捕获了,都是不会回滚的