☰
面试官:内层服务异常被 catch,为什么整个事务还是回滚了?Spring 事务传播一文通关
2026/10/31 2:13:32 网站建设 项目流程

✍️作者:王文峰(外号:神秘小峯 / 山峯)|中国国学、传统文化与代码爱好者的程序人生,期待你的关注和支持!

事务嵌套调用"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 住并正常返回,但提交时整个事务回滚、接口报错。这篇从最小复现 → 源码级根因 → 五种解法 → 微服务一致性 → 面试题带答案,把事务嵌套这个面试和生产的双重深坑讲透。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询