首页 > 其他分享 >@Transactional失效——同一个类中方法调用导致,解决方案!

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

时间:2023-07-02 16:31:45浏览次数:34  
标签:insert 调用 return Transactional CityInfoDict 失效 方法 类中 cityInfoDict



 同一个类中方法调用,导致@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);
    }
  注解失效原因分析:
  其实这还是由于使用Spring 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) 

标签:insert,调用,return,Transactional,CityInfoDict,失效,方法,类中,cityInfoDict
From: https://blog.51cto.com/u_16111396/6605891

相关文章

  • JupyterLab无法点击按钮、快捷键失效的解决方法
      本文介绍JupyterLab中菜单栏按钮无法点击、快捷键无法执行问题的解决办法。  近期打开JupyterLab后,发现其中菜单栏按钮无法点击,快捷键也均无法执行。如图,红框内的按钮点击均无任何反应。  为解决这一问题,首先尝试关闭VPN、浏览器代理设置等,均不奏效。随后,在搜索时看到St......
  • vscode 文件关闭后 全局搜索失效
    问题: vscode编译器在文件关闭后,全局搜索失效,无法搜索到文件内容,打开文件后,可以搜索到。原因:电脑安装了绿盾加密软件,对项目文件进行了加密,vscode编译器无法检索关闭的文件。解决方案:对项目文件进行解密操作(申请解密)......
  • Java 事务管理@Transactional注解rollbackFor回滚属性,事务的传播行为propagation(REQUI
    事务管理Java事务管理@Transactional注解rollbackFor属性所有的异常都回滚;事务的传播行为propagation(REQUIRED,REQUIRES_NEW)01.事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作请求。所以这组操作要么同时......
  • vxe-table 多选框手动设置选中方法setCheckboxRow(rows,true) 失效问题以及翻页保留选
    现象:rows数组里明明有三个对象,但是只有第一个的复选框选中原因:row-config配置项里需要配置keyField:'id' 翻页保留问题官方有配置项checkbox-config reserve 是否保留勾选状态,对于某些场景可能会用到,比如数据被刷新之后还保留之前选中的状态(需要有row-id)......
  • mybatisplus跨库操作和@Transactional一起使用的问题
    1、当方法使用了@Transactional注解,mybatisplus切换库之前已经有对当前库进行操作的话,切库将不成功;2、当方法使用了@Transactional注解,mybatisplus切换库之前没有对当前库进行操作的话,切库成功,但是@Transactional注解好像没有生效,操作报异常之后上一个操作没有回退;......
  • 同一个ip,不同端口号,session失效
    背景我有两个工程projectA、projectB,projectA放在TomcatA中,projectB放在TomcatB中,TomcatA、TomcatB在一台server上。工程都映射的根路径,不用project名字就可以访问,如下http://ip1:7777/http://ip1:8080/问题先在7777登录,然后再在8080登录,发现会把7777端口的用户踢下来;再在7777登......
  • Thread类中的常用线程调度方法sleep、yield、join
    sleepsleep方法是在Thread类中的一个静态方法,当一个线程调用了sleep方法,被调用的那个线程就会暂时的让出指定时间的CPU执行权,在这段时间也不会参与CPU的调度,当时间到了之后,就会重新回到就绪状态,等待CPU的再次调度,注意是就绪状态,而不是重新拿回CPU的执行权。并且,在休眠期间,只是会......
  • Mockito 静态类中的void方法
    moke例子(我直接用伪代码)publicclassDictUtils{ publicstaticvoidremoveDictCache(Stringkey){ //执行得方法业务 }}你的业务代码中引用这个类的方法publicvoiddeleteDictTypeByIds(Long[]dictIds){ DictUtils.removeDictCache(Stingkey); //业务代码......
  • ensp官方下载链接失效问题
    问题:2021.4.23日发现登录后打开链接ensp官方下载链接失效,但是文档还在https://support.huawei.com/enterprise/zh/nce-data-communication/ensp-pid-9017384/software   解决方法:使用替代网站下载http://ensp.1984cn.com/  问题原因:估计是因为ensp使用了0racle的virtualb0x......
  • 常见错误问题 --- chrome自带google翻译失效
    现象在英文网站时,地址栏没有翻译按钮、右键菜单没有翻译条目原因未知解决当地址栏没有翻译按钮时,看右键菜单有没有翻译条目当右键菜单没有翻译条目时,刷新网页再次看右键菜单有没有翻译条目注意加载页面时翻译......