✍️作者:王文峰(外号:神秘小峯 / 山峯)|中国国学、传统文化与代码爱好者的程序人生,期待你的关注和支持!
事务嵌套调用"rollback-only"异常:根因、解法与面试题
- 一、现场还原:最小复现代码
- 二、根因:rollback-only 标记是怎么被埋下的
- 1. REQUIRED 传播:内层外层是"同一个事务"
- 2. 异常发生时,Spring 把事务"标记为只许回滚"
- 3. 隐蔽变体:还有两种埋雷姿势
- 三、事务传播行为七种速查(解法的理论基础)
- 四、五种解法(按场景选,别乱用)
- 解法 1:内层 REQUIRES_NEW——彻底隔离(最常用)
- 解法 2:NESTED 保存点——允许部分回滚
- 解法 3:不 catch,整体回滚(业务允许时最干净)
- 解法 4:编程式事务——精确控制边界
- 解法 5:业务重构——失败前置 + 最终一致
- 五、微服务场景:"返回状态不正确"的分布式版本
- 六、事务面试题 8 连问(带答案)
- 七、避坑清单(事务嵌套 8 条)
- 八、总结与自测清单
- 🎯 学习教程(传送门)
- 🔥 往期文章
📚 先看这个报错(业务系统包装后的版本):
该服务嵌套调用的事件、微服务或者本地调用的返回状态不正确, 事务已被设置回滚!请检查是否正确返回它的底层原文是 Spring 的
UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only。症状很迷惑:服务 A 调服务 B(本地嵌套或微服务),B 抛异常、A catch 住并正常返回,但提交时整个事务回滚、接口报错。这篇从最小复现 → 源码级根因 → 五种解法 → 微服务一致性 → 面试题带答案,把事务嵌套这个面试和生产的双重深坑讲透。