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
  • 相关阅读:
    ElasticSearch(二) Transport Client Connection By Domain
    ElasticSearch(一) Transport Client
    如何把Spring Boot打包成war
    Lucene Query种类
    JAVA Http Basic auth
    Java 多线程系列2——多线程的生命周期及生产消费者模型
    Java 多线程系列1——浅聊JAVA 线程池的一般用法
    JS 实现右下角弹窗
    JS 实现兼容IE图片向左或向右翻转
    Vue Input输入框两侧加减框内数字组件
  • 原文地址:https://www.cnblogs.com/nxzblogs/p/10503889.html
Copyright © 2011-2022 走看看