news 2026/5/1 5:23:22

如果spring事务中出现了RuntimeException CheckedException,事务会如何处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如果spring事务中出现了RuntimeException CheckedException,事务会如何处理

Spring默认仅对RuntimeException及其子类、Error回滚事务,对IOException等Checked Exception不回滚;需用rollbackFor显式声明,且@Transactional仅对public方法生效,自调用、异常被吞等场景会导致失效。

Java中哪些异常会导致Spring事务自动回滚

Spring默认只对RuntimeException及其子类、Error触发事务回滚,对普通Exception(如IOExceptionSQLException)不会回滚。这是最容易踩的坑——你抛了Exception,数据库却已提交。

  • 显式声明回滚:用@Transactional(rollbackFor = Exception.class)覆盖默认行为
  • 避免吞掉异常:在try-catch中捕获后没重新抛出或没调用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(),事务照样提交
  • checked exception不触发回滚不是Bug,是Spring的设计选择——它假设你捕获这类异常后会主动处理业务逻辑分支

@Transactional 失效的常见场景

事务失效往往和代理机制有关,不是配置错了,而是代码没落在Spring代理能拦截到的位置。

  • 自调用失效:同一个类里方法A调用本类的@Transactional方法B,B的事务注解不生效(因为走的是this.B(),没经过CGLIB/JDK代理)
  • 非public方法:@Transactional 只对public方法有效;protectedprivate或包级方法加了也无效
  • 异常被吞:catch住异常后既没throw,也没调用setRollbackOnly()
  • 使用了错误的事务管理器:比如配置了JpaTransactionManager,但DAO层用的是JDBC模板,事务无法传播

手动控制回滚:setRollbackOnly() vs throw新异常

当业务逻辑需要“条件性回滚”,又不想抛出异常中断流程时,setRollbackOnly()是唯一可靠方式。

  • 必须在事务上下文中调用:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
  • 不能替代异常抛出:它只标记回滚,不终止方法执行;后续代码仍会运行,可能引发脏数据或NPE
  • 与throw对比:直接throwRuntimeException更清晰、更易测试;而setRollbackOnly()适合需要统一返回码、不暴露异常细节的API层

if(user.getBalance() < order.getAmount()) {

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

returnResult.fail("余额不足");

}

嵌套事务与REQUIRES_NEW的陷阱

PROPAGATION_REQUIRES_NEW看似能隔离子事务,但实际会挂起父事务,生成全新事务——这意味着父事务的隔离级别、超时设置、甚至数据库连接都失效了。

  • 日志/审计写入可能丢失:如果父事务回滚,而子事务(如发MQ消息)已提交,会出现状态不一致
  • 不能依赖父事务的数据库连接:REQUIRES_NEW 强制获取新连接,可能触发连接池耗尽
  • 慎用于“记录操作日志”:应优先用事件驱动或异步补偿,而非REQUIRES_NEW硬写库

真正需要隔离的场景,比如支付扣款+积分变更,建议拆成两个独立服务调用,靠最终一致性保障,而不是堆砌事务传播属性。

https://www.php.cn/faq/1998193.html

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/28 15:27:47

Obsidian如何使用Claude Code+Skills

大家在用Obsidian过程中&#xff0c;经常需要根据笔记生成各种图形&#xff08;如结构图或流程图等&#xff09;&#xff0c;如何在Obsidian中使用Claude Code&#xff0c;并借助已安装的skills进行笔记完善&#xff0c;生成新的内容等等。本次主要介绍Obsidian的另一个插件Cla…

作者头像 李华
网站建设 2026/4/30 5:43:32

基于布谷鸟算法优化Tsallis熵图像分割附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书…

作者头像 李华
网站建设 2026/5/1 4:56:46

SSM人才猎聘系统j9d6n(程序+源码+数据库+调试部署+开发环境)

本系统&#xff08;程序源码数据库调试部署开发环境&#xff09;带论文文档1万字以上&#xff0c;文末可获取&#xff0c;系统界面在最后面。 系统程序文件列表 开题报告内容 一、项目背景 随着企业竞争的日益激烈&#xff0c;人才已成为推动企业发展的重要资源。然而&#…

作者头像 李华
网站建设 2026/4/24 9:36:00

SSM入学新生信息管理系统y0mew程序+源码+数据库+调试部署+开发环境

本系统&#xff08;程序源码数据库调试部署开发环境&#xff09;带论文文档1万字以上&#xff0c;文末可获取&#xff0c;系统界面在最后面。 系统程序文件列表 开题报告内容 一、项目背景与意义 随着高校招生规模的不断扩大&#xff0c;新生信息管理工作变得日益复杂和繁琐…

作者头像 李华
网站建设 2026/5/1 5:02:23

Autodesk Inventor professiona

链接&#xff1a;https://pan.quark.cn/s/2a0c7227e03fAutodesk inventor professional 是欧特克公司针对机械设计领域而打造的一整套功能强大的机械设计解决方案&#xff0c;主要用于三维建模、仿真、可视化和文档编制。利用软件&#xff0c;工程师可以创建最终产品的虚拟表示…

作者头像 李华