Spring事务传播机制有哪些?
导语:
Spring事务传播机制是后端面试中的必考知识点,特别容易出现在“项目细节挖掘”阶段。面试官通过它来判断你是否真正理解事务控制的本质与异常传播机制。本文将从实战与源码角度出发,全面剖析Spring事务传播机制,帮助你答得有逻辑、有亮点,轻松拿捏核心面试题!
一、面试主题概述
Spring通过 @Transactional
注解支持声明式事务,其中事务的传播行为(Propagation)是关键参数之一。
所谓“传播”,是指当一个方法已经在事务中时,另一个方法是否加入、挂起、开启新事务等行为。
这部分不仅是基础框架知识的体现,更会在多模块协作、异常回滚设计中决定系统的数据一致性与鲁棒性。
如果你在项目中经常出现“事务没生效”“为什么没回滚”等问题,很可能根源就在传播机制没有理解透。
二、高频面试题汇总
- 你了解Spring事务的传播机制吗?说说有哪些类型及其区别。
- 如果一个方法使用
REQUIRES_NEW
,它和外层事务如何互动? NESTED
和REQUIRES_NEW
有什么本质区别?- 实际开发中,哪些场景适合使用
REQUIRES_NEW
? - 如果
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️⃣ NESTED
与 REQUIRES_NEW
有什么区别?
比较项 | NESTED | REQUIRES_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事务传播机制虽然是框架中的一环,但它牵涉到数据一致性、模块职责划分、异常恢复机制,是后端开发中必须精通的核心能力。
建议你这样准备:
✅ 理解每种传播行为的语义和差异
✅ 用简单项目示例演练嵌套调用、异常处理效果
✅ 准备一两个项目场景,展示你为什么选这个传播行为
相关文章:
Spring事务传播机制有哪些?
导语: Spring事务传播机制是后端面试中的必考知识点,特别容易出现在“项目细节挖掘”阶段。面试官通过它来判断你是否真正理解事务控制的本质与异常传播机制。本文将从实战与源码角度出发,全面剖析Spring事务传播机制,帮助你答得有…...

使用ch340继电器完成随机断电测试
前言 如图所示是市面上常见的OTA压测继电器,通过ch340串口模块完成对继电器的分路控制,这里我编写了一个脚本方便对4路继电器的控制,可以设置开启时间,关闭时间,复位等功能 软件界面 在设备管理器查看串口号后&…...

基于谷歌ADK的 智能产品推荐系统(2): 模块功能详解
在我的上一篇博客:基于谷歌ADK的 智能产品推荐系统(1): 功能简介-CSDN博客 中我们介绍了个性化购物 Agent 项目,该项目展示了一个强大的框架,旨在模拟和实现在线购物环境中的智能导购。它不仅仅是一个简单的聊天机器人,更是一个集…...

VSCode 没有添加Windows右键菜单
关键字:VSCode;Windows右键菜单;注册表。 文章目录 前言一、工程环境二、配置流程1.右键文件打开2.右键文件夹打开3.右键空白处打开文件夹 三、测试总结 前言 安装 VSCode 时没有注意,实际使用的时候发现 VSCode 在 Windows 菜单栏…...

vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能
vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能 查看官网:https://vxetable.cn 效果 代码 通过 checkbox-config.isShift 启用批量选中,启用后按住快捷键和鼠标批量选取 <template><div><vxe-grid v-bind"gri…...

Android Framework预装traceroute执行文件到system/bin下
文章目录 Android SDK中寻找traceroute代码内置traceroute到SDK中traceroute参数说明-I 参数(使用 ICMP Echo 请求)-T 参数(使用 TCP SYN 包) 相关文章 Android SDK中寻找traceroute代码 设备使用的是Android 11,在/s…...

生信服务器 | 做生信为什么推荐使用Linux服务器?
原文链接:生信服务器 | 做生信为什么推荐使用Linux服务器? 一、 做生信为什么推荐使用服务器? 大家好,我是小杜。在做生信分析的同学,或是将接触学习生信分析的同学,<font style"color:rgb(53, 1…...

react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)
之前都是使用react-pdf来渲染pdf文件,这次有个需求是要兼容xp环境,xp上chrome最高支持到49,虽然说iframe或者embed都可以实现预览pdf,但为了后续的定制化需求,还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...

RKNN开发环境搭建2-RKNN Model Zoo 环境搭建
目录 1.简介2.环境搭建2.1 启动 docker 环境2.2 安装依赖工具2.3 下载 RKNN Model Zoo2.4 RKNN模型转化2.5编译C++1.简介 RKNN Model Zoo基于 RKNPU SDK 工具链开发, 提供了目前主流算法的部署例程. 例程包含导出RKNN模型, 使用 Python API, CAPI 推理 RKNN 模型的流程. 本…...
AT模式下的全局锁冲突如何解决?
一、全局锁冲突解决方案 1. 业务层重试机制(推荐方案) Service public class OrderService {GlobalTransactionalRetryable(maxAttempts 3, backoff Backoff(delay 100))public void createOrder(OrderDTO order) {// 库存扣减(自动加全…...

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题
20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题 2025/6/9 20:54 缘起,为了跨网段推流,千辛万苦配置好了网络参数。 但是命令iptables -t filter -F tetherctrl_FORWARD可以在调试串口/DEBUG口正确执行。…...
[QMT量化交易小白入门]-六十二、ETF轮动中简单的评分算法如何获取历史年化收益32.7%
本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。 QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。 文章目录 相关阅读1. 策略概述2. 趋势评分模块3 代码解析4 木头…...

21-Oracle 23 ai-Automatic SQL Plan Management(SPM)
小伙伴们,有没有迁移数据库完毕后或是突然某一天在同一个实例上同样的SQL, 性能不一样了、业务反馈卡顿、业务超时等各种匪夷所思的现状。 于是SPM定位开始,OCM考试中SPM必考。 其他的AWR、ASH、SQLHC、SQLT、SQL profile等换作下一个话题…...

性能优化中,多面体模型基本原理
1)多面体编译技术是一种基于多面体模型的程序分析和优化技术,它将程序 中的语句实例、访问关系、依赖关系和调度等信息映射到多维空间中的几何对 象,通过对这些几何对象进行几何操作和线性代数计算来进行程序的分析和优 化。 其中࿰…...

【Zephyr 系列 16】构建 BLE + LoRa 协同通信系统:网关转发与混合调度实战
🧠关键词:Zephyr、BLE、LoRa、混合通信、事件驱动、网关中继、低功耗调度 📌面向读者:希望将 BLE 和 LoRa 结合应用于资产追踪、环境监测、远程数据采集等场景的开发者 📊篇幅预计:5300+ 字 🧭 背景与需求 在许多 IoT 项目中,单一通信方式往往难以兼顾近场数据采集…...

二维数组 行列混淆区分 js
二维数组定义 行 row:是“横着的一整行” 列 column:是“竖着的一整列” 在 JavaScript 里访问二维数组 grid[i][j] 表示 第i行第j列的元素 let grid [[1, 2, 3], // 第0行[4, 5, 6], // 第1行[7, 8, 9] // 第2行 ];// grid[i][j] 表示 第i行第j列的…...

HTML版英语学习系统
HTML版英语学习系统 这是一个完全免费、无需安装、功能完整的英语学习工具,使用HTML CSS JavaScript实现。 功能 文本朗读练习 - 输入英文文章,系统朗读帮助练习听力和发音,适合跟读练习,模仿学习;实时词典查询 - 双…...

【threejs】每天一个小案例讲解:创建基本的3D场景
代码仓 GitHub - TiffanyHoo/three_practices: Learning three.js together! 可自行clone,无需安装依赖,直接liver-server运行/直接打开chapter01中的html文件 运行效果图 知识要点 核心三要素 场景(Scene) 使用 THREE.Scene(…...

C#中用于控制自定义特性(Attribute)
我们来详细解释一下 [AttributeUsage(AttributeTargets.Class, AllowMultiple false, Inherited false)] 这个 C# 属性。 在 C# 中,Attribute(特性)是一种用于向程序元素(如类、方法、属性等)添加元数据的机制。Attr…...

2025 后端自学UNIAPP【项目实战:旅游项目】7、景点详情页面【完结】
1、获取景点详情的请求【my_api.js】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http(/login/getWXSessionKey, {code,avatar}); };//…...

项目进度管理软件是什么?项目进度管理软件有哪些核心功能?
无论是建筑施工、软件开发,还是市场营销活动,项目往往涉及多个团队、大量资源和严格的时间表。如果没有一个系统化的工具来跟踪和管理这些元素,项目很容易陷入混乱,导致进度延误、成本超支,甚至失败。 项目进度管理软…...
iOS 项目怎么构建稳定性保障机制?一次系统性防错经验分享(含 KeyMob 工具应用)
崩溃、内存飙升、后台任务未释放、页面卡顿、日志丢失——稳定性问题,不一定会立刻崩,但一旦积累,就是“上线后救不回来的代价”。 稳定性保障不是某个工具的功能,而是一套贯穿开发、测试、上线全流程的“观测分析防范”机制。 …...
02-性能方案设计
需求分析与测试设计 根据具体的性能测试需求,确定测试类型,以及压测的模块(web/mysql/redis/系统整体)前期要与相关人员充分沟通,初步确定压测方案及具体的性能指标QA完成性能测试设计后,需产出测试方案文档发送邮件到项目组&…...
window 显示驱动开发-如何查询视频处理功能(三)
D3DDDICAPS_GETPROCAMPRANGE请求类型 UMD 返回指向 DXVADDI_VALUERANGE 结构的指针,该结构包含特定视频流上特定 ProcAmp 控件属性允许的值范围。 Direct3D 运行时在D3DDDIARG_GETCAPS的 pInfo 成员指向的变量中为特定视频流的 ProcAmp 控件属性指定DXVADDI_QUER…...
MySQL基本操作(续)
第3章:MySQL基本操作(续) 3.3 表操作 表是关系型数据库中存储数据的基本结构,由行和列组成。在MySQL中,表操作包括创建表、查看表结构、修改表和删除表等。本节将详细介绍这些操作。 3.3.1 创建表 在MySQL中&#…...

JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除
目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作…...
SpringCloud优势
目录 完善的微服务支持 高可用性和容错性 灵活的配置管理 强大的服务网关 分布式追踪能力 丰富的社区生态 易于与其他技术栈集成 完善的微服务支持 Spring Cloud 提供了一整套工具和组件来支持微服务架构的开发,包括服务注册与发现、负载均衡、断路器、配置管理等功能…...
Electron简介(附电子书学习资料)
一、什么是Electron? Electron 是一个由 GitHub 开发的 开源框架,允许开发者使用 Web技术(HTML、CSS、JavaScript) 构建跨平台的桌面应用程序(Windows、macOS、Linux)。它将 Chromium浏览器内核 和 Node.j…...

深入理解 C++ 左值右值、std::move 与函数重载中的参数传递
在 C 编程中,左值和右值的概念以及std::move的使用,常常让开发者感到困惑。特别是在函数重载场景下,如何合理利用这些特性来优化代码性能、确保语义正确,更是一个值得深入探讨的话题。 在开始之前,先提出几个问题&…...
【大厂机试题解法笔记】矩阵匹配
题目 从一个 N * M(N ≤ M)的矩阵中选出 N 个数,任意两个数字不能在同一行或同一列,求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求:1 ≤ K ≤ N ≤ M ≤ 150 输入格式 N M K N*M矩阵 输…...