- 问题:Controller层有一个方法,调用service层的methodA方法,methodA方法调用同类中的methodB方法,前提是methodA方法未加事务,methodB方法有加事务,里面有插入和修改两个方法,问如果methodB方法里面发生异常,事务是否起作用
- 答案:事务不起作用
- 分析:
- @Transactional是基于动态代理的方式给sql加事务,当容器扫描到这个注解的时候,会给该注解所在的类创建一个代理类,使用cglib代理
- 它会给带有注解的那个方法的前面开启事务,当我们通过A方法调用B方法的时候,实际上是执行代理类中的A方法,因为代理类中的A方法,直接调用的就是原有类中的方法,并没有加事务,所以B方法里的代码事务是不起作用的
- 解决办法
- 给A和B方法分别都加上事务
- 使用不同的类调用方法
- 在类上加上事务(非常规操作)