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

建议你这样准备:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

相机Camera日志实例分析之一:相机Camx【前置慢动作分辨率切换720P、1080P录制】单帧流程日志详解

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 1、打…

OpenHarmony标准系统-HDF框架之I2C驱动开发

文章目录 引言I2C基础知识概念和特性协议,四种信号组合 I2C调试手段硬件软件 HDF框架下的I2C设备驱动案例描述驱动Dispatch驱动读写 总结 引言 I2C基础知识 概念和特性 集成电路总线,由串网12C(1C、12C、Inter-Integrated Circuit BUS)行数据线SDA和串…

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…

数据库优化实战分享:高频场景下的性能调优技巧与案例解析

在实际开发与生产运维中,数据库的性能瓶颈往往是影响系统响应速度和用户体验的关键因素。尤其是在高并发访问、海量数据处理、复杂查询逻辑等高频场景下,数据库优化不仅仅是“锦上添花”,更是“雪中送炭”。本篇博文将结合实际项目经验&#…

Python importlib 动态加载

文章目录 1. importlib 库 概述2. 导入模块(import_module())2.1. 导入已安装的模块2.2. 导入子模块2.3 通过字符串变量导入模块 3. 重新加载模块(reload())4. 检查模块是否存在(find_spec())5. 获取模块路…

(1-6-4) Java IO流实现文件的读取与写入

目录 0.前述概要 1. File类 1.1 概述 1.2 File的重要方法 1.3 java.io 1.3.1 四种抽象类 1.3.2 流 1.3.3 其他常用 I/O 流 2. 字节输入流(InputSteam) 2.1 关系类图 2.2 应用实现 3. 字节输出流(OutputStream) 3.1 …

【Proteus仿真】【32单片机-A010】步进电机控制系统设计

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、LCD显示当前挡位、方向等; 2、按键控制步进电机挡位、方向等。 二、使用步骤 系统运行后,LCD1602显示当前挡位、方向; 通过按键…

DeepSeek-R1-0528-Qwen3-8B为底座微调领域大模型准备:制作领域专用数据集

前言 想要微调领域大模型,数据的准备是必不可少的。然而微调大模型需要的数据极多,这样花费很多人力和准备。有没有方便又高效的方法?一下子就可以准备大量的领域专用数据集呢? 制作领域专用数据集 这里制作的数据集格式为使用的aphaca格式的 1.启动vllm服务 python -m…

WEB3全栈开发——面试专业技能点P6后端框架 / 微服务设计

一、Express Express是国内大部分公司重点问的。我在本文最后,单独讲解了Express框架。 概念介绍 Express 是基于 Node.js 平台的极简、灵活且广泛使用的 Web 应用框架。它提供了一系列强大的功能,用于构建单页、多页及混合型的 Web 应用程序和 API 服…

游戏开发中的CI/CD优化案例:知名游戏公司Gearbox使用TeamCity简化CI/CD流程

案例背景 关于Gearbox: Gearbox 是一家美国电子游戏公司,总部位于德克萨斯州弗里斯科,靠近达拉斯。Gearbox 成立于1999年,推出过多款史上最具代表性的视频游戏,包括《半衰期》、《战火兄弟连》以及《无主之地》。 团队…

视觉slam--三维刚体运动

线性代数 外积与矩阵乘法的等价性 欧拉角的奇异性--万向死锁 现象 第二个轴旋转度,会导致第三个旋转轴和恶原始坐标轴的第一个旋转轴重合,导致第一次旋转与第三次旋转都使用了同一个轴进行旋转,也就是本质上旋转三次,但是只在两个…

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献

Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…

CppCon 2015 学习:REFLECTION TECHNIQUES IN C++

关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…

R语言速释制剂QBD解决方案之一

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…

“详规一张图”——新加坡土地利用数据

在城市规划和土地管理领域,精确且详尽的空间数据是进行有效决策的基石。随着地理信息系统(GIS)技术的发展,我们能够以前所未有的精度和细节来捕捉、分析和展示土地利用信息。这不仅提升了数据的质量和可靠性,还使得城市…

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…

MySQL自定义函数零基础学习教程

1. 引言 想象一下,你在用计算器做数学题。每次计算"圆形面积"时,你都要输入:3.14 半径 半径。如果能把这个计算步骤保存起来,下次只要输入半径就自动算出面积,那该多方便! MySQL自定义函数就…

八股---7.JVM

1. JVM组成 1.1 JVM由哪些部分组成?运行流程? 难易程度:☆☆☆ 出现频率:☆☆☆☆ Java Virtual Machine:Java 虚拟机,Java程序的运行环境(java二进制字节码的运行环境)好处:一次编写,到处运行;自动内存管理,垃圾回收机制程序运行之前,需要先通过编译器将…

企业级AI-DevOps工具链的构成及实现方案

企业级AI-DevOps工具链的构成及实现方案 DevOps在AI大模型研发中的重要性及应用背景一、场景驱动的AI产品研发运营机制二、AI-DevOps生产线建设三、基于DevOps的AI大模型研发机制四、基于DevOps的智能体场景研发机制五、场景驱动的应用评估分析机制 DevOps在AI大模型研发中的重…

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…