在事务方法中调用另外一个事务方法,被调用方法的事务没起作用

在事务方法中调用另外一个事务方法,被调用方法的事务没起作用

问题描述:(例)

  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