一文讲透 Spring 事务:传播行为、隔离级别与底层原理
Spring 事务的核心作用是保证一组数据库操作要么全部成功要么全部失败。它在数据库事务之上提供了统一抽象使开发者无须直接操作 JDBC 的提交和回滚。一、Spring 事务的类型与管理方式按资源范围划分事务可分为两类本地事务只操作单个数据库或资源常由DataSourceTransactionManager、JpaTransactionManager管理。全局事务协调多个数据库或消息等资源传统方案可使用 JTA。分布式系统中也可能采用 Seata 等方案。按使用方式划分Spring 支持两种事务管理方式编程式事务通过TransactionTemplate或PlatformTransactionManager手动控制灵活但业务代码与事务代码耦合。声明式事务使用Transactional或 XML 配置由 Spring AOP 自动管理。实际开发中更常用。二、七种事务传播行为传播行为解决的问题是一个事务方法调用另一个事务方法时新方法应该加入原事务还是创建新事务传播行为含义REQUIRED有事务就加入没有就新建默认值REQUIRES_NEW挂起当前事务创建独立新事务SUPPORTS有事务就加入没有就以非事务方式运行NOT_SUPPORTED挂起当前事务以非事务方式运行MANDATORY必须存在事务否则抛出异常NEVER必须不存在事务否则抛出异常NESTED在当前事务中创建保存点失败可回滚到保存点高频区别是REQUIRES_NEW创建独立事务内外事务分别提交NESTED通常依赖外部物理事务和保存点外部事务整体回滚时嵌套部分也无法保留。三、Transactional的底层原理Transactional( propagation Propagation.REQUIRED, rollbackFor Exception.class ) public void createOrder() { orderMapper.insertOrder(); stockMapper.deductStock(); }Transactional本身只是事务元数据默认通过 Spring AOP 代理生效。外部调用代理对象时事务拦截器先读取注解配置再通过事务管理器获取数据库连接、关闭自动提交并开启事务。方法正常结束则提交满足回滚规则的异常抛出则回滚。同步事务中Spring 通过ThreadLocal将连接等事务资源绑定到当前线程使同一线程内的多个数据库操作共享同一个事务。最终真正提供原子性、隔离性和持久性的仍是数据库事务机制。因此事务上下文默认不会自动传播到新建线程响应式事务则使用 Reactor Context而非普通ThreadLocal。默认代理模式还存在一个常见问题同一个类中使用this调用另一个Transactional方法会绕过代理导致事务注解失效。四、事务隔离级别Spring 提供五种隔离级别隔离级别作用DEFAULT使用底层数据库的默认隔离级别READ_UNCOMMITTED可能出现脏读、不可重复读和幻读READ_COMMITTED避免脏读REPEATABLE_READ避免脏读和不可重复读SERIALIZABLE串行执行并发能力最低隔离级别越高并发问题越少但锁竞争和性能开销通常越大。MySQL InnoDB 默认是REPEATABLE_READ但 Spring 的DEFAULT并不固定等于该级别而是跟随当前数据库。五、异常出现后是否回滚Transactional默认遇到未被捕获并传播到事务代理之外的RuntimeException或Error会回滚遇到受检异常默认不会回滚。若希望所有业务异常都回滚可以配置Transactional(rollbackFor Exception.class)如果方法内部使用try-catch吞掉异常代理感知不到异常通常会正常提交。此时可以重新抛出异常或调用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()标记回滚。六、JDK 动态代理与 CGLIB在 Spring Framework 的常规代理规则中目标类实现接口时可使用 JDK 动态代理没有实现接口时使用 CGLIB通过生成目标类的子类完成代理。也可以设置proxyTargetClass true强制使用 CGLIB。所以这不是运行时失败后的“降级切换”而是创建代理时根据接口和配置进行选择。CGLIB 无法代理final类也无法增强final、private等不能被子类重写的方法。Spring Boot 的默认代理配置可能与纯 Spring Framework 不同面试时应说明具体环境。七、Spring 5 之后多个 AOP 通知的顺序对一次正常调用可以记成Around 前置 → Before → 目标方法 → AfterReturning → After → Around 后置目标方法抛出异常时AfterThrowing替代AfterReturning。从 Spring 5.2.7 开始同一切面中会可靠地保证AfterReturning或AfterThrowing先于After执行。多个切面之间应通过Order或Ordered明确顺序数值越小进入时越先执行退出时越后执行整体类似过滤器嵌套。不要依赖同一切面中多个同类型通知的方法声明顺序最好拆分切面或显式指定顺序。八、总结Spring 声明式事务以 AOP 代理为入口通过事务管理器控制数据库事务并在线程同步模型下借助ThreadLocal绑定事务资源。Transactional默认传播行为是REQUIRED、隔离级别是DEFAULT未捕获的运行时异常会触发回滚。掌握传播行为、回滚规则、代理边界和 AOP 顺序才能避免“注解写了但事务没有生效”的问题。参考资料Spring 事务注解、Spring 事务抽象、Spring AOP 代理机制。

相关新闻

让企业礼品册兑换更高效:一站式礼品册兑换网站建设全攻略

让企业礼品册兑换更高效:一站式礼品册兑换网站建设全攻略

在这个讲究体验与效率的时代,企业福利和商务馈赠早已不再是简单的“发一堆米面油”或者“塞一张硬通货购物卡”那么简单了。尤其是对于大中型企业来说,如何在保持成本控制的同时,让员工和客户感受到满满的诚意和尊重,是一道经久不衰的管理难题。传统的礼品发放方式,不仅 l…

2026/10/14 3:40:49 阅读更多 →
LeetCode 34:在排序数组中查找元素的首尾位置——Java 两次二分查找详解

LeetCode 34:在排序数组中查找元素的首尾位置——Java 两次二分查找详解

一、题目描述给定一个按照非递减顺序排列的整数数组 nums,以及一个目标值 target,要求找出目标值在数组中的开始位置和结束位置。如果数组中不存在 target,返回 [-1,-1]。题目要求算法的时间复杂度必须为 O(log n)。例如:输入&…

2026/10/13 2:34:47 阅读更多 →
Windows系统重装全流程指南:从备份到驱动安装的完整实践

Windows系统重装全流程指南:从备份到驱动安装的完整实践

1. 从“系统崩溃”到“焕然一新”:为什么你需要这篇指南如果你正在搜索“电脑重装系统”,大概率正面临一个令人头疼的局面:也许是用了三五年的老电脑,开机比蜗牛还慢,弹窗广告比正事还多;也许是手贱更新了某…

2026/10/9 8:48:51 阅读更多 →

最新新闻

DNA到蛋白质的完整路径:转录、翻译与中心法则的分子实战

DNA到蛋白质的完整路径:转录、翻译与中心法则的分子实战

DNA怎么变成蛋白质?这个问题的完整答案,比课本上那张中心法则的箭头要丰富得多。我当年第一次给学生讲清楚转录和翻译的全程时,最深的感受是:知识链条其实不长,但每一环都有大量“看似理所当然、实则经不起追问”的细节…

2026/10/14 3:40:38 阅读更多 →
基于CNN的水下声源定位实战:从数据到部署全流程

基于CNN的水下声源定位实战:从数据到部署全流程

简介:一套基于PyTorch的海洋水下声源定位实战项目,使用卷积神经网络(CNN)对水下声学信号进行建模,预测声源方位角与距离,完整覆盖从声学数据到位置估计的流程。资源面向水声工程、人工智能、电子信息、自动…

2026/10/14 3:40:38 阅读更多 →
Falcom经典游戏源码构建与调试实战指南

Falcom经典游戏源码构建与调试实战指南

简介:本资源为Falcom十大经典游戏系列的项目源码整理包,面向游戏开发初学者、JRPG爱好者及逆向分析兴趣者,提供一份轻量级参考素材,辅助理解经典日式RPG的设计脉络与基础架构逻辑。压缩包共3个文件,含1个HTML页面&…

2026/10/14 3:40:38 阅读更多 →
秋叶SD整合包V5.0代码版:从改代码到批量出图API实战

秋叶SD整合包V5.0代码版:从改代码到批量出图API实战

简介:秋叶SD整合包V5.0面向希望快速上手Stable Diffusion的Windows新手用户,解决环境配置繁琐、参数调节门槛高的问题。资源包共3个文件,以inscode工程配置、html页面与gitignore忽略规则为主,压缩包仅6KB,属于轻量级代…

2026/10/14 3:40:38 阅读更多 →
三站时差定位球面模型实战:从时差解算到经纬度

三站时差定位球面模型实战:从时差解算到经纬度

简介:这份资源围绕三站时差定位(TDOA)展开,面向无线通信、雷达定位与物联网设备追踪方向的学习者和开发者,重点解决无GPS覆盖环境下利用信号到达时间差解算信号源位置的问题。内容涉及Chan提出的球面TDOA实现思路&…

2026/10/14 3:40:38 阅读更多 →
一张图微调YOLOv11:自然栖息地鸟类检测的流程与扩充

一张图微调YOLOv11:自然栖息地鸟类检测的流程与扩充

简介:面向 YOLOv11 模型验证需求,这份精简版鸟类目标检测数据集包含一张真实野外鸟类图像及配套标准标注,可用于快速原型验证、轻量级部署测试与小样本检测基线建立。压缩包共五个文件,包含三张 JPG 图像、一个数据配置文件与一个…

2026/10/14 3:39:38 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →