Spring @Transactional 完整避坑指南 + 生产级真实业务事务设计
一、Transactional 说明Transactional是 Spring 提供的声明式事务注解底层基于 AOP 动态代理实现用来保证一组数据库操作的原子性要么全部成功要么全部失败。核心工作流程方法执行前开启事务正常执行完成提交事务抛出指定异常自动回滚事务常用核心属性rollbackFor指定哪些异常触发回滚propagation事务传播行为isolation事务隔离级别readOnly标记为只读事务用于优化查询异常回滚规则重点Spring 默认行为对RuntimeException和Error自动回滚对普通Exception受检异常不回滚因此生产环境统一推荐写法Transactional(rollbackFor Exception.class)Exception 与 RuntimeException 区别Exception所有异常的父类包含受检异常和运行时异常RuntimeException属于Exception的子类无需强制捕获只写rollbackFor RuntimeException.class等价于默认行为风险极高业务异常可能不回滚二、Transactional 常见不回滚坑附示例1. 异常被 try-catch 捕获没有抛出Transactional(rollbackFor Exception.class) public void test() { try { aMapper.insert(); throw new RuntimeException(); } catch (Exception e) { // 异常被吞事务不回滚 } }2. 抛出受检异常但未配置 rollbackForTransactional public void test() throws Exception { aMapper.insert(); throw new Exception(); // 不回滚 }3. 事务方法不是 publicTransactional private void test() { aMapper.insert(); throw new RuntimeException(); }4. 同类内部使用 this 调用事务方法public void outer() { this.inner(); } Transactional public void inner() { aMapper.insert(); throw new RuntimeException(); }5. 外层方法捕获内层事务异常// 外层 public void outer() { try { innerService.test(); } catch (Exception e) { // 吞异常导致内层事务不回滚 } } // 内层 Transactional public void test() { aMapper.insert(); throw new RuntimeException(); }6. 数据表引擎为 MyISAMCREATE TABLE a (id BIGINT) ENGINE MyISAM;7. 在新线程中执行数据库操作Transactional public void test() { new Thread(() - { aMapper.insert(); throw new RuntimeException(); }).start(); }8. 传播行为设置为 NOT_SUPPORTED / NEVERTransactional(propagation Propagation.NOT_SUPPORTED) public void test() { aMapper.insert(); throw new RuntimeException(); }9. 类未被 Spring 管理无 Service/Componentpublic class AService { Transactional public void test() { aMapper.insert(); } }10. 多数据源未指定事务管理器Transactional public void test() { // 操作非默认数据源 bMapper.update(); }三、实战场景插入 → 更新 → 写日志 → 发通知业务流程插入 A 表返回主键 ID根据 A 的 ID 更新 B 表记录操作日志发送消息通知设计原则A、B 操作必须原子一致放在同一事务日志独立事务无论成功失败都要记录消息在事务提交后发送避免数据回滚但消息已发出完整实现1. 主业务 ServiceService public class BizService { Autowired private AMapper aMapper; Autowired private BMapper bMapper; Autowired private LogService logService; Autowired private MsgService msgService; public void process(BizDTO dto) { Long aId null; try { aId insertAAndUpdateB(dto); logService.saveLog(aId, 执行成功, 1); msgService.sendMsg(aId); } catch (Exception e) { logService.saveLog(aId, 执行失败 e.getMessage(), 0); throw e; } } Transactional(rollbackFor Exception.class) public Long insertAAndUpdateB(BizDTO dto) { // 插入 A 表 A a new A(); a.setName(dto.getName()); aMapper.insert(a); Long aId a.getId(); // 更新 B 表 B b new B(); b.setAId(aId); bMapper.updateById(b); return aId; } }2. 日志 Service独立事务Service public class LogService { Autowired private LogMapper logMapper; Transactional(propagation Propagation.REQUIRES_NEW, rollbackFor Exception.class) public void saveLog(Long aId, String content, Integer status) { Log log new Log(); log.setAId(aId); log.setContent(content); log.setStatus(status); logMapper.insert(log); } }3. 消息 ServiceService public class MsgService { public void sendMsg(Long aId) { System.out.println(消息推送成功关联ID aId); } }场景效果A、B 任意一步异常 → 主事务回滚无脏数据主事务回滚不影响日志记录仅事务完全成功后才推送消息保证业务一致性四、Transactional 用法总结核心必记生效前提必须加在public方法上类必须被 Spring 管理Service/Component必须通过代理对象调用避免同类 this 直接调用回滚配置生产统一使用rollbackFor Exception.class不要依赖默认行为避免受检异常不回滚事务范围控制只把核心数据库操作放入事务不要包太多逻辑避免在事务内做远程调用、复杂计算、消息发送、文件 IO 等慢操作防止大事务导致锁等待、连接占用、性能下降异常处理不要随意吞异常catch 后要么重新抛出要么手动回滚手动回滚可用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();传播行为使用场景默认REQUIRED适用于绝大多数业务日志、监控记录等使用REQUIRES_NEW新开独立事务查询方法可使用SUPPORTS或不加事务其他规范数据库引擎必须使用 InnoDB多数据源场景必须指定对应的事务管理器只读查询建议加readOnly true便于优化复杂业务事务设计核心增删改同一事务保证原子性日志记录独立事务不影响主流程消息 / 通知 / 第三方调用放在事务提交后执行保证数据与消息最终一致

相关新闻

MELO 音乐中文教程:掌握提示词、歌曲结构与歌词编辑的完整创作指南

MELO 音乐中文教程:掌握提示词、歌曲结构与歌词编辑的完整创作指南

在你的音乐创作旅程中,解锁 MELO 音乐的全部潜力。本教程涵盖核心创作技巧,包括 MELO 专属音乐提示词编写、歌曲结构标签使用、人声与歌词优化方法,帮助你零基础也能创作出专业级的完整音乐作品。一、MELO 音乐介绍及其核心功能 MELO 音乐是国…

2026/8/1 9:47:18阅读更多 →
深度硬件调优:解锁AMD Ryzen隐藏性能的工程实践

深度硬件调优:解锁AMD Ryzen隐藏性能的工程实践

深度硬件调优:解锁AMD Ryzen隐藏性能的工程实践 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcode.…

2026/8/1 9:47:18阅读更多 →
MusicFree插件完整指南:三分钟解锁全网免费音乐资源

MusicFree插件完整指南:三分钟解锁全网免费音乐资源

MusicFree插件完整指南:三分钟解锁全网免费音乐资源 【免费下载链接】MusicFreePlugins MusicFree播放插件 项目地址: https://gitcode.com/gh_mirrors/mu/MusicFreePlugins 还在为各大音乐平台的VIP限制而烦恼吗?想要一个真正免费、跨平台的音乐…

2026/8/1 9:47:18阅读更多 →
AI文档批量处理实战手册(从PDF扫描件到可搜索知识图谱的完整链路)

AI文档批量处理实战手册(从PDF扫描件到可搜索知识图谱的完整链路)

更多请点击: https://codechina.net 第一章:AI文档批量处理实战手册(从PDF扫描件到可搜索知识图谱的完整链路) 将纸质文档转化为结构化、可检索、可推理的知识资产,是企业知识管理的关键跃迁。本章聚焦真实生产场景—…

2026/8/1 18:13:52阅读更多 →
语义令牌与字典引用的机器防线

语义令牌与字典引用的机器防线

《语义令牌表》和 《语义字典》已经解决了一个核心问题:语义被编码为离散、可查询、可校验的机器码本。status.critical 不是色值别名,而是一个指向"红色脉冲 八边形图标 必须二次确认 仅用于 transactional 域"的语义索引。《Token 层差异…

2026/8/1 18:13:52阅读更多 →
可操控电脑的 AI 智能体 OpenClaw,Windows 图形化安装分步教学(含安装包)

可操控电脑的 AI 智能体 OpenClaw,Windows 图形化安装分步教学(含安装包)

OpenClaw(小龙虾)Windows 一键部署保姆级教程|10 分钟搭建专属 AI 数字员工 前言 当下热度较高的开源 AI 智能体 OpenClaw,爱好者习惯称其为小龙虾,项目在 GitHub 积累了大量星标。产品主打本地运行、零代码操作、自…

2026/8/1 18:13:52阅读更多 →
AI 文件自动化工具 OpenClaw 安装指南,新手可直接上手(含安装包)

AI 文件自动化工具 OpenClaw 安装指南,新手可直接上手(含安装包)

OpenClaw 本地 AI 自动化工具部署教程✨图形化一键搭建环境 适配平台:Windows 10/11 64 位、macOS Windows 版本:v2.9.0 macOS 版本:v2.7.9 安装包大小:45.8MB 📥资源下载地址 Windows v2.9.0:https://x…

2026/8/1 18:13:52阅读更多 →
USB Type-C接口深度解析:从物理引脚到协议栈的全面指南

USB Type-C接口深度解析:从物理引脚到协议栈的全面指南

1. 从“正反插”到“万能口”:USB Type-C的演进与核心价值 十年前,我们给手机充电、给电脑传文件,还得眯着眼睛对准接口的豁口,生怕插反了把接口弄坏。那个时代,Micro-USB是绝对的主流,但它的“防呆不防傻”…

2026/8/1 18:13:52阅读更多 →
51单片机+TLC1543实现双路交流电流检测与LCD1602显示系统

51单片机+TLC1543实现双路交流电流检测与LCD1602显示系统

如果你正在用51单片机做电流检测项目,特别是需要同时监测两路交流电流,还希望用LCD1602实时显示数据,那么TLC1543这款11通道10位ADC芯片可能是你最容易忽略但最实用的选择。 很多初学者在电流检测项目中会直接使用单片机自带的ADC&#xff0…

2026/8/1 18:11:52阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/31 20:44:05阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/31 17:41:43阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/31 20:44:05阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/1 0:00:10阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/1 0:00:10阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/1 0:00:10阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/1 0:00:10阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/1 0:00:10阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/1 0:00:10阅读更多 →