对于我们在使用事务的时候,如果我们自己的业务代码中,通过try catch去捕获了异常,那此时原本应该回滚的事务是无法进行回滚的,这个spring事务底层的处理逻辑有关系

应用

代码就不贴了,给各截图,偷个懒

如果这个代码去执行的时候,是没有问题的,事务会进行回滚,但是假如我们其中的一个或者两个try catch都打开之后,就会出现,原本应该回滚的事务,却不回滚了,这是在事务拦截器执行的时候,会对业务代码进行异常捕获,假如我们自己捕获了异常,事务拦截器就无法拦截到异常

为什么不回滚

为什么不回滚,是和spring事务底层的代码有关系,至于spring事务是如何生成代理对象的,如何被拦截的,就不说了,在前面的笔记中有说过,我们来看,spring事务拦截到之后,所执行的代码

org.springframework.transaction.interceptor.TransactionAspectSupport#invokeWithinTransactionprotected Object invokeWithinTransaction(Method method, @Nullable Class<?> targetClass,final InvocationCallback invocation) throws Throwable {// If the transaction attribute is null, the method is non-transactional.TransactionAttributeSource tas = getTransactionAttributeSource();final TransactionAttribute txAttr = (tas != null ? tas.getTransactionAttribute(method, targetClass) : null);final TransactionManager tm = determineTransactionManager(txAttr);PlatformTransactionManager ptm = asPlatformTransactionManager(tm);final String joinpointIdentification = methodIdentification(method, targetClass, txAttr);if (txAttr == null || !(ptm instanceof CallbackPreferringPlatformTransactionManager)) {// 1.根据当前是否存在事务,和不同的传播机制,去判断是要挂起事务,还是生成新的事务等TransactionInfo txInfo = createTransactionIfNecessary(ptm, txAttr, joinpointIdentification);Object retVal;try {// 2.这是去执行目标方法retVal = invocation.proceedWithInvocation();}catch (Throwable ex) {// 3.在目标方法抛出异常时,判断是否需要进行回滚completeTransactionAfterThrowing(txInfo, ex);throw ex;}finally {// 4.清理事务信息,恢复挂起的事务cleanupTransactionInfo(txInfo);}if (vavrPresent && VavrDelegate.isVavrTry(retVal)) {// Set rollback-only in case of Vavr failure matching our rollback rules...TransactionStatus status = txInfo.getTransactionStatus();if (status != null && txAttr != null) {retVal = VavrDelegate.evaluateTryFailure(retVal, txAttr, status);}}commitTransactionAfterReturning(txInfo);return retVal;}
}

这是目标方法被拦截之后,执行的部分代码,也是这个问题的核心,我们可以看到,对于异常回滚的处理,是在try catch里面去处理的,也就是说,如果我们自己在业务代码中,去捕获了异常,那也意味着,在这里是无法执行到catch里面的逻辑,所以,会进行事务得提交,那这样肯定是有问题的,所以,在实际业务代码中,一定要注意,如果加了事务注解,那一定不要在代码中取捕获异常,如果说想要把异常处理的更为通用或者规范,那可以在捕获到异常之后,对异常记录或者处理之后,再抛出一个异常,这样,才能被事务的拦截器捕获到,然后进行回滚的操作,要不然,事务就失去了其意义

spring事务失效二:业务代码捕获异常相关推荐

  1. 详细整理Spring事务失效的具体场景及解决方案

    实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机制:好多小伙伴可能只是简单了解一下,遇到事务失效的情况,便会无从下手,溪源此篇文章给大家整理了一下常见Sprin ...

  2. 面试官:Spring事务失效的场景有哪些?如何解决?

     作者:溪~源 blog.csdn.net/xuan_lu/article/details/107797505 实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机 ...

  3. 你否有遇到Spring事务失效,花费太多时间找bug

    作者:溪~源 来源:blog.csdn.net/xuan_lu/article/details/107797505 实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事 ...

  4. 8个Spring事务失效的场景,你碰到过几种?

    前言 作为Java开发工程师,相信大家对Spring种事务的使用并不陌生.但是你可能只是停留在基础的使用层面上,在遇到一些比较特殊的场景,事务可能没有生效,直接在生产上暴露了,这可能就会导致比较严重的 ...

  5. 详解spring事务失效和回滚失败的场景

    详解spring事务失效和回滚失败的场景 详解spring事务失效和回滚失败的场景 前言 一 .事务不生效 1.访问权限问题 2. 方法用final修饰 3.方法的内部调用 3.1 新加一个Servi ...

  6. spring事务失效了? @Transactional不管用了 ?看看这些@Transation的坑

    spring事务失效了? @Transactional不管用了 ?看看这些@Transactional的坑 文章目录 spring事务失效了? @Transactional不管用了 ?看看这些@Tra ...

  7. Spring 事务失效?看这篇文章就够了!

    欢迎关注方志朋的博客,回复"666"获面试宝典 用 Spring 的 @Transactional 注解控制事务有哪些不生效的场景? 不知道小伙伴们有没有这样的经历,在自己开心的编 ...

  8. Spring 事务失效的 8 大场景,看看你都遇到过几个?

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/Yang_yangyang/ article/details/114359881 用 Spring 的 @Transaction ...

  9. 使用Spring特性优雅书写业务代码

    作者:阿里巴巴淘系技术 链接:https://www.zhihu.com/question/60761181/answer/1737592739 来源:知乎 著作权归作者所有.商业转载请联系作者获得授 ...

  10. Spring事务失效 -方法内部调用

    首先感谢网友的文章 Spring事务失效的2种情况 JDK动态代理给Spring事务埋下的坑 前提知识: 两个前提 1 注解使用 spring容器的事务管理注解 @org.springframewor ...

最新文章

  1. UVA - 1594 Ducci Sequence
  2. [Android]用架构师角度看插件化(2)-Replugin 唯一hook点
  3. IPTV的QoE评价方法
  4. Linux DNS服务详解——DNS基础知识
  5. 《新概念模拟电路》系列电子书下载
  6. 键盘精灵 android,「安卓按键精灵」使用按键发送邮件
  7. 买房注意事项收集(zt)
  8. 中英文论文写作指导第一部分(文题、摘要、关键字)
  9. MWC - 飞控套件CRIUS MWC MultiWii SE v2.6组装
  10. wangEditor富文本编辑器自定义图片上传
  11. 2022年茶叶行业现状分析
  12. Function ‘MseLossBackward0‘ returned nan values in its 0th output.
  13. pandas dataframe获取列名、添加列名、列索引
  14. mysql 查询最多的_MySQL中用通用查询日志找出查询次数最多的语句的教程
  15. hp笔记本无线网服务器,惠普电脑连不上无线网该怎么办
  16. 生成模型笔记预备知识笔记——概率分布变换
  17. Magik Eye将在2019年嵌入式视觉峰会上宣布突破性的3D感应技术Invertible Light™
  18. 【软考高项】拿到信息系统项目管理师职业证书的备考方法
  19. 金融时间序列分析——对收益率序列平稳化处理
  20. Linux中搭建Redis集群及redis集群配置常见问题总结

热门文章

  1. 容器技术Docker K8s 26 容器服务ACK基础与进阶-监控管理
  2. mac sublime text 3 列操作,替换相同内容, 用动态输入的方式
  3. 解决XCode运行app在模拟器上,提示模拟器不存在
  4. 剑指 只出现一次的数字
  5. 计算机一级考证心得体会,计算机一级考试的心得体会
  6. python如何设置双索引_python-在新的多索引下串联熊猫列
  7. 凸优化第二章凸集 2.5分离与支撑超平面
  8. hdu acm 1016
  9. svm出现浮点数与字符串不能计算的错误(label必须为 整形或浮点型)
  10. android studio | openGL es 3.0增强现实(AR)开发 (4) 绘制简单的2D图形、显示、旋转