问题:

在Spring管理的项目中,方法A使用了Transactional注解,试图实现事务性。但当同一个class中的方法B调用方法A时,会发现方法A中的异常不再导致回滚,也即事务失效了。

原因:

Transactional是Spring提供的事务管理注解。

重点在于,Spring采用动态代理(AOP)实现对bean的管理和切片,它为我们的每个class生成一个代理对象。只有在代理对象之间进行调用时,可以触发切面逻辑。(Spring动态代理详情可戳:spring自动加载,使用实现类无法加载,使用接口却可以的原因)

而在同一个class中,方法B调用方法A,调用的是原对象的方法,而不通过代理对象。所以Spring无法切到这次调用,也就无法通过注解保证事务性了。

解决方法1:

将事务方法放到另一个类中(或者单独开启一层,取名“事务层”)进行调用,即符合了在对象之间调用的条件。

解决方法2:

获取本对象的代理对象,再进行调用。具体操作如:

  1. Spring-content.xml上下文中,增加配置:<aop:aspectj-autoproxy expose-proxy=“true”/>

  2. 在xxxServiceImpl中,用(xxxService)(AopContext.currentProxy()),获取到xxxService的代理类,再调用事务方法,强行经过代理类,激活事务切面。

解决方法3:

很多时候,方法内调用又希望激活事务,是由于同一个方法既有DAO操作又有I/O等耗时操作,不想让耗时的I/O造成事务的太长耗时(比如新增商品同时需要写入库存)。此时,可以将I/O做成异步操作(如加入线程池),而加入线程池的操作即便加入事务也不会导致事务太长,问题可以迎刃而解。

相同类方法之间调用,注解失效的问题相关推荐

  1. 同一个类里方法互相调用注解失效问题

    问题:同一个类中一个不加注解的方法调用另一个加注解的方法,注解失效 第一个图调用第二个图的方法 打印日志注解失效 解决办法: 添加以下代码 import org.springframework.aop ...

  2. service和controller都加了事务_「Spring声明式事务」在service内部之间调用竟然失效啦?...

    在开发过程中你是否遇到过这样的问题,当在Controller中调用Service中A()方法,A方法内部又调用Service中B()方法,由于A方法中只有查询操作所以没有加事务控制,B方法中含有多次修 ...

  3. Spring - 同一个类中的方法互相调用,注解失效问题的分析和解决(转)

    Spring - 同一个类中的方法互相调用,注解失效问题的分析和解决(转) 参考文章: (1)Spring - 同一个类中的方法互相调用,注解失效问题的分析和解决(转) (2)https://www. ...

  4. 在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解失效的原因和解决方法

    在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解失效的原因和解决方法 参考文章: (1)在同一个类中,一个方法调用另外一个有注解(比如@Async, ...

  5. spring同一个类中,一个方法调用另外一个注解(@Transactional)方法时,注解失效

    title: "spring同一个类中,一个方法调用另外一个注解(@Transactional)方法时,注解失效" url: "https://wsk1103.githu ...

  6. 一口气说出 6种 @Transactional 注解失效场景

    引言 昨天公众号粉丝咨询了一个问题,说自己之前面试被问@Transactional注解哪些场景下会失效,一时语塞致使面试失败.所以今天简单的和大家分享一下@Transactional相关的知识. @T ...

  7. @getmapping注解的作用_@Transactional注解失效了?你遇到的是这6种场景吧!

    引言 昨天公众号粉丝咨询了一个问题,说自己之前面试被问@Transactional注解哪些场景下会失效,一时语塞致使面试失败.所以今天简单的和大家分享一下@Transactional相关的知识. @T ...

  8. 使用feign调用注解在eureka上的微服务,简单学会微服务

    使用feign调用注解在eureka上的微服务. 首先,确保所有服务(调用方与被调用方)都被注册在同一个eureka服务上. 1. 在调用方添加依赖(万事第一步,加依赖) <dependency ...

  9. feign调用多个服务_Spring Cloud多个微服务之间调用代码实例

    这篇文章主要介绍了Spring Cloud多个微服务之间调用代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 现在又一个学生微服务 user ...

最新文章

  1. SP11469 SUBSET - Balanced Cow Subsets(折半搜索+状态压缩)难度⭐⭐⭐⭐★
  2. 【机器学习】GBDT 与 LR 的区别总结
  3. 真香!你的 2019 年终总结已经出 - 请查收
  4. iOS 项目经验以及APP上架流程 _Dylan
  5. leetcode 380. Insert Delete GetRandom O(1) | 380. O(1) 时间插入、删除和获取随机元素(Java)
  6. 交换机开发(二)—— 三层交换机报文转发过程
  7. vivado 如何创建工程模式_基于Vivado的FPGA高性能开发研修班2019年8月30日上海举行...
  8. 26 MM配置-采购-采购申请-定义编码范围
  9. android学习笔记---34_Activity的启动模式
  10. Exceed 13+Gambit 2.4.6 +Tgrid 安装
  11. Vbs调用MsAgent组件,很有趣
  12. 主流的推荐系统算法总结
  13. Windows迅雷X去广告美化终结版Thunder X来了!
  14. python结束运行快捷键_Pycharm2017常用快捷键
  15. 如何将caj格式文件转换成word文档
  16. python selenium学习之新浪微博
  17. GNU ARM汇编--(二十)总结
  18. 【ARM】迅为rk3568开发板buildroot添加桌面应用
  19. python conda无法安装包 报错An HTTP error occurred when trying to retrieve this URL.
  20. 【echarts实现】中国地图 世界地图

热门文章

  1. sql INNER JOIN 取得两个表中存在连接匹配关系的记录(mysql)
  2. 360文件粉碎机_中山三乡资料文件销毁粉碎销毁资料文件公司一览表
  3. 这相册一出手,哪个长辈搞不定?
  4. Java类集-set
  5. 浅谈协同过滤推荐算法
  6. 作业优先调度java代码_如何在触发它时在java代码中为hadoop作业设置优先级?
  7. php 画图 坐标,说说PHP作图(一)_php
  8. c语言分配多一个字符空间,关于C语言动态给字符串分配内存空间问题
  9. java awt区域_java的awt包中有没有表示区域的类或者方法,可以传递一个Rectangle
  10. oracle 12c 多线程,Oracle 12c(12.1)中性能优化功能增强之通过参数THREADED_EXECTION使用多线程模型...