在事务方法中调用另外一个事务方法,被调用方法的事务没起作用
在事务方法中调用另外一个事务方法,被调用方法的事务没起作用
问题描述:(例)
service层有两个事务方法insertUser1、insertUser2, 当在insertUser1中调用insertUser2是,如果前面 方法异常,后边方法不会保存
期望:不管insertUser1是否报错,insertUser2 都要报存数据
@Transactional(propagation = Propagation.REQUIRED) public void insertUser1(){ User user = new User("niu","男",19,"1000000"); userDao.insertUser(user); this.insertUser2(); //异常 int a = 10/0; } @Transactional(propagation = Propagation.REQUIRES_NEW) public void insertUser2(){ User user = new User("xing","女",19,"1111111"); userDao.insertUser(user); }
产生问题的原因是:spring是通过代理代管理事务的,当在第一个方法insertUser1内直接调用insertUser2的时候 ,insertUser2上的事务是不会起作用的(也就是insertUser2是没有开启事务)
解决:
springboot:开始aop事务,在启动类application上添加注解@EnableAspectJAutoProxy(exposeProxy = true)
@SpringBootApplication @EnableAspectJAutoProxy(exposeProxy = true) public class TestbootApplication { public static void main(String[] args) { SpringApplication.run(TestbootApplication.class, args); } }
同时在调用insertUser2时不直接调用,而是通过代理的方式调用:
将代码修改:
@Transactional(propagation = Propagation.REQUIRED) public void insertUser1(){ User user = new User("niu","男",19,"1000000"); userDao.insertUser(user); //this.insertUser2(); ((UserService)AopContext.currentProxy()).insertUser2(); //异常 int a = 10/0; } @Transactional(propagation = Propagation.REQUIRES_NEW) public void insertUser2(){ User user = new User("xing","女",19,"1111111"); userDao.insertUser(user); }
这样在调用insertUser2的时候回起用事务管理(((UserService)AopContext.currentProxy()).insertUser2();方法的时候,会将当前事务挂起,重新开启另一个新的事务来执行语句)
可以通过以下代码来判断类是否是代理类:
boolean isProxy = AopUtils.isAopProxy((UserService)AopContext.currentProxy());
true:是代理类
false:不是代理类
详细博客:https://www.cnblogs.com/micrari/p/7612962.html