news 2026/9/7 8:56:54

如果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/9/3 10:03:39

语音识别模型的分布式训练环境搭建指南

语音识别模型的分布式训练环境搭建指南 如果你正在处理海量的音频数据&#xff0c;或者想训练一个更强大的语音识别模型&#xff0c;单张显卡可能已经力不从心了。训练速度慢得像蜗牛&#xff0c;显存动不动就爆掉&#xff0c;模型规模也上不去。这时候&#xff0c;分布式训练…

作者头像 李华
网站建设 2026/9/3 7:29:24

Qwen2.5-7B-Instruct在运维自动化中的应用:智能故障诊断与处理

Qwen2.5-7B-Instruct在运维自动化中的应用&#xff1a;智能故障诊断与处理 1. 运维工程师的日常痛点&#xff0c;真的需要一个新解法吗&#xff1f; 每天早上打开监控系统&#xff0c;告警消息像瀑布一样刷屏&#xff1b;深夜被电话叫醒&#xff0c;说生产环境服务突然不可用…

作者头像 李华
网站建设 2026/8/29 10:45:09

基于ThinkPHP5开发的ERP进销存与仓储管理PHP源码系统

温馨提示&#xff1a;文末有联系方式 产品概述 本系统是一款采用ThinkPHP5框架开发的企业级ERP进销存与仓库管理一体化PHP源码&#xff0c;涵盖采购、、库存、出入库、盘点、报表等核心业务模块&#xff0c;代码结构清晰、注释完整&#xff0c;便于技术团队快速上手与深度定制。…

作者头像 李华
网站建设 2026/9/6 16:58:39

【第二十九周】机器学习笔记三十

摘要 本周学习了强化学习中是如何对actor的行为进行评估的&#xff0c;了解了critic的基本概念与工作原理&#xff0c;并进一步学习了Advantage Actor-Critic架构 abstract This week, I learned about how the actors behavior is evaluated in reinforcement learning, un…

作者头像 李华
网站建设 2026/9/3 7:28:21

28.FPGA实验报告模板(串口为例)

一、实验概述 1. 实验目的 实现常用模块&#xff1a;串口模块&#xff0c;可以用来打印调试信息&#xff0c;可以通过上位机输入指令。 2. 实验环境&#xff08;开发板型号、EDA工具版本等&#xff09; 开发板型号&#xff1a;MLK-F20-CM02-4EV EDA版本&#xff1a; Vivado…

作者头像 李华