zoukankan      html  css  js  c++  java
  • 在事务方法中调用另外一个事务方法,被调用方法的事务没起作用

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

    问题描述:(例)

      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
  • 相关阅读:
    算法学习(十五)
    学习正则表达式笔记(三)
    学习正则表达式笔记(二)
    事件监听器
    socket(套接字)
    (转载)表驱动法
    C++文件读写
    齐次表示
    线性插值(linear interpolation)
    向上取整Ceil,向下取整Floor,四舍五入Round
  • 原文地址:https://www.cnblogs.com/nxzblogs/p/10503889.html
Copyright © 2011-2022 走看看