当前位置: 首页 > 图灵资讯 > 技术篇> @Transactional失效——同一个类中方法调用导致,解决方案!

@Transactional失效——同一个类中方法调用导致,解决方案!

来源:图灵教育
时间:2023-07-02 17:10:08

 在同一类中调用方法,导致@Transactional失效开发中不可避免地会调用同一类中的方法,比如有一类Test,它的一种方法A,A再调用这类方法B(无论方法B是用public还是private装饰),但方法A没有声明注释事务,而B方法有。外部调用方法A后,方法B的事务不起作用。这也是一个经常犯错误的地方。     @GetMapping("/test")    private Integer A() throws Exception {        CityInfoDict cityInfoDict = new CityInfoDict();        cityInfoDict.setCityName("2");        /**         * B 插入字段为 3的数据         */        int insert=insertB();        /**         * A 插入字段为 2的数据         */        int insert = cityInfoDictMapper.insert(cityInfoDict);         return insert;    }     @Transactional()    public Integer insertB() throws Exception {        CityInfoDict cityInfoDict = new CityInfoDict();        cityInfoDict.setCityName("3");        cityInfoDict.setParentCityId(3);         return cityInfoDictMapper.insert(cityInfoDict);    }  注解失效原因分析:  事实上,这仍然是因为使用Springng AOP代理造成的,因为Spring生成的代理对象只有在事务方法被当前类别以外的代码调用时才会管理。  解决方案:  利用spring提供的动态代理机制。1.引入spring动态代理:<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-aop</artifactId>    <version>2.3.3.RELEASE</version></dependency>2.将方法调用改为动态代理调用:     @GetMapping("/test")    private Integer A() throws Exception {        CityInfoDict cityInfoDict = new CityInfoDict();        cityInfoDict.setCityName("2");              // B 插入字段为 3的数据        Test test = (Test)AopContext.currentProxy();         int insert=test.insertB();               int insert = cityInfoDictMapper.insert(cityInfoDict);         return insert;    }     @Transactional()    public Integer insertB() throws Exception {        CityInfoDict cityInfoDict = new CityInfoDict();        cityInfoDict.setCityName("3");        cityInfoDict.setParentCityId(3);         return cityInfoDictMapper.insert(cityInfoDict);    }可能提示:Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available.添加代理类:@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)