当前位置: 首页 > news >正文

Spring事务传播机制有哪些?

导语:
Spring事务传播机制是后端面试中的必考知识点,特别容易出现在“项目细节挖掘”阶段。面试官通过它来判断你是否真正理解事务控制的本质与异常传播机制。本文将从实战与源码角度出发,全面剖析Spring事务传播机制,帮助你答得有逻辑、有亮点,轻松拿捏核心面试题!


一、面试主题概述

Spring通过 @Transactional 注解支持声明式事务,其中事务的传播行为(Propagation)是关键参数之一。
所谓“传播”,是指当一个方法已经在事务中时,另一个方法是否
加入、挂起、开启新事务
等行为。

这部分不仅是基础框架知识的体现,更会在多模块协作、异常回滚设计中决定系统的数据一致性与鲁棒性
如果你在项目中经常出现“事务没生效”“为什么没回滚”等问题,很可能根源就在传播机制没有理解透。


二、高频面试题汇总

  1. 你了解Spring事务的传播机制吗?说说有哪些类型及其区别。
  2. 如果一个方法使用 REQUIRES_NEW,它和外层事务如何互动?
  3. NESTEDREQUIRES_NEW 有什么本质区别?
  4. 实际开发中,哪些场景适合使用 REQUIRES_NEW
  5. 如果 Propagation.NOT_SUPPORTED 的方法抛出异常,外层事务是否受影响?

三、重点题目详解

1️⃣ 你了解Spring事务的传播机制吗?说说有哪些类型及其区别。

答:
Spring支持的事务传播机制共有7种,分别是:

类型描述
REQUIRED(默认)有事务就加入,没有就新建一个
REQUIRES_NEW总是开启新事务,挂起当前事务
NESTED如果存在事务,则开启嵌套事务(SavePoint保存点)
SUPPORTS有事务就用,没有就非事务方式执行
NOT_SUPPORTED强制不使用事务,若有事务则挂起
NEVER强制无事务,有事务则抛出异常
MANDATORY必须在事务中运行,若没有事务则抛出异常

代码示例:

@Transactional(propagation = Propagation.REQUIRED)
public void outerMethod() {innerService.innerMethod(); // 默认也是 REQUIRED,加入同一事务
}@Transactional(propagation = Propagation.REQUIRES_NEW)
public void innerMethod() {// 会开启一个新的事务,outerMethod 的事务将被挂起
}

考察点解析:

  • 能否清晰解释每种传播机制用途,是考察对事务控制粒度的掌握。
  • 面试官后续可能追问具体的异常场景回滚策略,所以基础务必打牢。

2️⃣ REQUIRES_NEW 和外层事务的回滚关系?

答:
REQUIRES_NEW 会挂起当前事务,开启一个全新的事务。两者是独立提交、独立回滚的。

@Transactional
public void outer() {try {inner(); // inner 使用 REQUIRES_NEW} catch (Exception e) {// 捕获后 outer 可以不回滚}throw new RuntimeException(); // 仅回滚 outer 事务
}@Transactional(propagation = Propagation.REQUIRES_NEW)
public void inner() {// 提交成功,即使 outer 回滚也不影响
}

场景举例:

  • 记录日志或审计数据(不能因主流程失败而丢失)
  • 第三方接口调用结果保存(确保幂等)

3️⃣ NESTEDREQUIRES_NEW 有什么区别?

比较项NESTEDREQUIRES_NEW
是否新建事务否,嵌套当前事务是,挂起当前事务
是否独立提交否,主事务失败则全部回滚是,互不影响
实现机制SavePoint(保存点)真正的新事务

代码示例:

@Transactional
public void parent() {child(); // NESTED,不抛异常不会影响 parentthrow new RuntimeException(); // parent rollback,child 也回滚
}@Transactional(propagation = Propagation.NESTED)
public void child() {// 设置保存点,可在当前事务失败前“部分提交”
}

考察点解析:

  • 区分是否 “真实隔离”事务边界 ,是高级候选人的标配能力。
  • 能讲出 SavePoint 概念或 Spring 内部事务管理器实现,是加分项。

4️⃣ 实际开发中,哪些场景适合使用 REQUIRES_NEW

  • 记录操作日志,即使主流程失败也要保留痕迹。
  • 向第三方服务发送异步通知或邮件(不影响主事务的业务执行)。
  • 系统异常情况下补偿事务机制的使用。

踩坑提醒:
使用 REQUIRES_NEW 时需要确保数据库连接数充足,因为每个新事务需要单独连接。


5️⃣ 如果 Propagation.NOT_SUPPORTED 的方法抛出异常,外层事务是否受影响?

答:
NOT_SUPPORTED 表示挂起当前事务,以非事务方式执行。此时即使抛出异常,也不会回滚外层事务。

@Transactional
public void outer() {try {noTxMethod(); // NOT_SUPPORTED,非事务执行} catch (Exception e) {// 捕获后 outer 事务可继续}// outer方法仍处于事务中
}@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void noTxMethod() {throw new RuntimeException("非事务逻辑异常");
}

考察点解析:

  • 面试官通过这个问题判断你是否清楚事务挂起与传播边界的影响。
  • 理解传播机制不仅是理论问题,更关乎项目中数据一致性的保障。

四、面试官视角与加分项

Spring事务传播机制是一个“宽口径、高落点”的面试入口点:

面试官目的候选人应对方式
考察对分布式一致性理解举例“日志独立记录”或“幂等写库”场景
判断是否有实战经验分享 REQUIRES_NEW 踩坑或 NESTED 使用经验
了解源码掌握深度简述事务拦截器 TransactionInterceptor 源码流程
延伸提问能力准备好 @Transactional 的异常传播、rollbackFor、嵌套调用等衍生点

加分项:

  • 清晰画出传播机制行为对照图(谁挂起、谁加入、谁隔离)
  • 主动引入“事务传播 + 异常处理”的组合问题(try-catch 嵌套场景)

五、总结与建议

Spring事务传播机制虽然是框架中的一环,但它牵涉到数据一致性、模块职责划分、异常恢复机制,是后端开发中必须精通的核心能力。

建议你这样准备:

✅ 理解每种传播行为的语义和差异
✅ 用简单项目示例演练嵌套调用、异常处理效果
✅ 准备一两个项目场景,展示你为什么选这个传播行为

相关文章:

  • AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月9日第103弹
  • STM32---外部32.768K晶振(LSE)无法起振问题
  • 前端绘制道路鱼骨图
  • AI-Python机器学习与深度学习实践技术应用
  • 2025年css+html面试题
  • mybatisX的使用,简化springboot的开发,不用再写entity、mapper以及service了!
  • deepbayes lecture1: 贝叶斯框架简介
  • 计算机系统结构复习-名词解释2
  • RT_Thread——线程管理(上)
  • 论文检测器
  • 2025年全国I卷数学压轴题解答
  • 邮科ODM摄像头:多维度护航高铁安全系统方案解析
  • leetcode刷题日记——岛屿数量
  • 结构化文件管理实战:实现目录自动创建与归类
  • [软件测试]:什么软件测试?如何设计测试用例?
  • IPMB:智能平台管理总线——数据中心硬件的“神经系统”详解
  • [USACO23FEB] Bakery S
  • (37)课56--??:建立保存点 SAVEPOINT spA,回滚(至保存点) ROLLBACK (to spA)及综合举例。
  • 从落水到快速救援:北斗如何打通生命通道
  • CSS 布局指南
  • 莒县做网站/百度推广联盟
  • 设计微信小程序/网站优化排名金苹果系统
  • 网站ico图标怎么做/软文网站大全
  • 保密和档案网站建设方案/网站流量数据分析
  • 中小企业的网站建设方案/国际新闻最新消息10条
  • 通州企业网站建设/中国最新消息