【Spring框架学习(六)】:Spring事务实现原理
Spring框架学习系列《Spring框架学习一从设计思想到核心架构全面认识Spring》《Spring框架学习二IOC核心原理解析为什么Autowired可以自动注入》《Spring框架学习三Spring Bean生命周期详解》《Spring框架学习四Spring AOP动态代理实现原理》《Spring框架学习五Spring MVC请求处理流程解析》《Spring框架学习六Spring事务实现原理》《Spring框架学习七Spring Boot自动配置原理》《Spring框架学习八Spring源码整体流程总结》一、前言在企业级 Java 开发中事务是非常重要的一部分。例如银行转账业务public void transfer(){ //账户A扣钱 //账户B加钱 }这个业务必须满足A扣钱成功B加钱成功如果A扣钱成功但是B加钱失败。那么数据就会出现错误。因此需要事务保证一组数据库操作要么全部成功要么全部失败。在 Spring 中我们经常使用Transactional public void transfer(){ }只需要添加一个注解Spring 就可以自动完成开启事务提交事务异常回滚那么Transactional背后到底发生了什么本文将从事务基础、Spring事务模型、AOP实现原理以及源码流程几个方面进行分析。二、什么是事务事务Transaction简单理解一个不可分割的数据库操作单元。事务具有四个基本特性ACID1. 原子性Atomicity事务中的操作要么全部完成,要么全部不完成。例如转账扣钱 加钱不能只执行一半。2. 一致性Consistency事务执行前后数据必须保持正确。例如账户总金额A账户 B账户 固定值不会因为失败导致数据错误。3. 隔离性Isolation多个事务同时执行时互相不影响。例如两个用户同时修改订单。4. 持久性Durability事务提交后数据永久保存。三、传统事务处理方式在没有 Spring 之前开发者需要手动控制事务。例如Connection conn dataSource.getConnection(); try{ conn.setAutoCommit(false); //业务代码 conn.commit(); }catch(Exception e){ conn.rollback(); }问题大量重复代码业务代码和事务代码混合容易遗漏例如每个Service方法都需要写begin(); commit(); rollback();维护成本非常高。四、Spring事务解决方案Spring提供声明式事务也就是只需要声明。例如Transactional public void createOrder(){ }开发者只关注业务,事务交给Spring管理。五、Spring事务核心思想Spring事务本质依然是AOP。流程调用业务方法 ↓ 事务代理对象 ↓ 开启事务 ↓ 执行目标方法 ↓ 提交事务 ↓ 异常回滚和AOP流程非常类似。因为事务本身就是一种增强逻辑。六、Transactional执行原理我们写Service public class OrderService { Transactional public void createOrder(){ saveOrder(); } }Spring启动时扫描这个类。发现Transactional然后创建代理对象。原对象OrderService变成OrderServiceProxy调用orderService.createOrder();实际上代理对象 ↓ 事务拦截器 ↓ 开启事务 ↓ 真实方法执行 ↓ 提交事务七、Spring事务核心组件Spring事务主要由几个核心类组成。1. PlatformTransactionManager事务管理器接口。负责开启事务提交事务回滚事务接口public interface PlatformTransactionManager { TransactionStatus getTransaction(); void commit(); void rollback(); }不同数据库有不同实现。例如MySQLDataSourceTransactionManagerJPAJpaTransactionManager2. TransactionDefinition事务定义。保存事务配置例如传播行为隔离级别超时时间3. TransactionStatus事务状态。记录当前事务执行情况。八、Spring事务执行流程完整流程Controller调用Service ↓ 进入事务代理 ↓ TransactionInterceptor ↓ 创建事务 ↓ 执行目标方法 ↓ 没有异常 ↓ commit提交 出现异常 ↓ rollback回滚九、事务核心源码入口Spring事务核心TransactionInterceptor它本质是一个MethodInterceptor。也就是AOP拦截器。核心方法invoke()流程invoke(){ 获取事务信息 开启事务 执行业务方法 提交或回滚 }十、事务开启过程调用Transactional public void save(){ }进入TransactionInterceptor然后调用transactionManager.getTransaction()创建事务。例如JDBC事务connection.setAutoCommit(false);关闭自动提交。十一、事务提交业务方法执行成功例如saveOrder();没有异常。执行commit();数据库提交修改。十二、事务回滚如果业务出现异常throw new RuntimeException();Spring捕获异常。执行rollback();数据库恢复原状态。十三、为什么默认RuntimeException才会回滚这是很多开发者容易遇到的问题。例如Transactional public void save(){ throw new Exception(); }发现没有回滚。原因Spring默认规则回滚RuntimeException Error不回滚ExceptionSpring认为检查异常可能是业务可处理异常。如果需要指定Transactional( rollbackFor Exception.class )十四、事务失效常见情况1. 方法不是public例如Transactional private void save(){ }不会生效。原因Spring AOP代理无法增强。2. 同类方法调用例如public void methodA(){ methodB(); } Transactional public void methodB(){ }调用this.methodB();不会经过代理,事务不会生效。3. 对象不是Spring管理例如new UserService();自己创建的对象不会有事务代理。4. 异常被捕获例如try{ save(); }catch(Exception e){ }异常没有抛出,Spring无法感知失败。十五、事务传播行为实际项目中一个事务可能调用另一个事务。例如订单创建调用库存扣减,这就是事务传播。Spring提供Transactional( propagation xxx )常见REQUIRED默认。如果存在事务加入当前事务。不存在创建新事务。REQUIRES_NEW总是创建新事务。挂起当前事务。SUPPORTS有事务加入。没有事务也执行。十六、事务隔离级别数据库并发问题包括脏读读取未提交数据。不可重复读同一数据两次读取结果不同。幻读查询结果数量发生变化。Spring支持Transactional( isolation Isolation.xxx )常见READ_COMMITTED REPEATABLE_READ SERIALIZABLE十七、Spring事务源码核心类重点关注作用核心类事务注解解析TransactionAttributeSource事务拦截TransactionInterceptor事务管理PlatformTransactionManager事务状态TransactionStatus事务同步TransactionSynchronizationManager十八、Spring事务整体流程总结完整流程Transactional ↓ Spring创建代理对象 ↓ 调用代理方法 ↓ TransactionInterceptor拦截 ↓ 开启数据库事务 ↓ 执行目标方法 ↓ 成功 commit ↓ 异常 rollback十九、总结Spring事务的核心不是Transactional注解本身。而是AOP代理 事务管理器 数据库事务。整个过程业务方法 ↓ AOP代理 ↓ 事务拦截器 ↓ 开启事务 ↓ 执行业务 ↓ 提交/回滚理解 Spring 事务之后就能明白为什么Transactional可以自动回滚为什么事务依赖AOP为什么事务有时会失效为什么需要事务传播和隔离级别下一篇文章《Spring框架学习七Spring Boot自动配置原理》将进入 Spring Boot 核心机制分析SpringBootApplication、自动配置以及 Starter 的底层实现。

相关新闻

动力电池产能利用率40%背后:行业分化、统计陷阱与未来格局

动力电池产能利用率40%背后:行业分化、统计陷阱与未来格局

1. 一个被误解的数字:动力电池产能利用率40%的真实含义最近在行业交流群里,看到不少朋友在转发和讨论“动力电池产能利用率只有40%”这个数据,很多人第一反应是“行业要凉了”、“产能严重过剩”。作为一个在电池产业链上下游摸爬滚打了十来年…

2026/8/18 19:20:30 阅读更多 →
MySQL时间处理实战:从INTERVAL到性能优化,解决时区与统计难题

MySQL时间处理实战:从INTERVAL到性能优化,解决时区与统计难题

1. 从一次数据统计需求说起:为什么需要关注MySQL时间处理? 最近在做一个用户活跃度的周报统计,需求很简单:计算过去7天内,每天的新增用户数。乍一看,不就是个 WHERE create_time > DATE_SUB(NOW(), INT…

2026/8/18 19:20:30 阅读更多 →
面包板深度指南:结构原理、实战技巧与调试全解析

面包板深度指南:结构原理、实战技巧与调试全解析

1. 从零开始认识面包板:电子世界的“乐高积木” 如果你对电子制作、单片机编程或者DIY一些小玩意儿感兴趣,那么“面包板”绝对是你绕不开的第一个,也是最重要的一个工具。我第一次接触它的时候,感觉就像拿到了一盒电子世界的“乐高…

2026/8/18 19:19:30 阅读更多 →

最新新闻

Spring Boot集成Apache Dubbo 3.x:构建高效微服务通信与治理架构

Spring Boot集成Apache Dubbo 3.x:构建高效微服务通信与治理架构

1. 项目背景与核心价值 如果你正在构建一个微服务架构,或者想把一个单体应用拆分成多个独立部署的服务,那么服务间的通信就是你绕不开的核心问题。过去我们可能用HTTP API,简单直接,但在高并发、服务治理、链路追踪这些复杂场景下…

2026/8/18 23:23:10 阅读更多 →
基于Ollama与Milvus的Java版RAG知识库搭建指南

基于Ollama与Milvus的Java版RAG知识库搭建指南

1. 项目概述 最近在本地搭建了一个基于Ollama和Milvus的RAG知识库助手,整个过程踩了不少坑,也积累了一些经验。这个方案特别适合需要私有化部署的企业或个人开发者,既能保证数据安全,又能利用大语言模型的能力。下面我就把完整的搭…

2026/8/18 23:23:10 阅读更多 →
Blender 3MF 插件免费安装全指南:如何把模型的颜色、尺寸与打印参数完整送进切片软件

Blender 3MF 插件免费安装全指南:如何把模型的颜色、尺寸与打印参数完整送进切片软件

Blender 3MF 插件免费安装全指南:如何把模型的颜色、尺寸与打印参数完整送进切片软件 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 在 Blender 里花一下午调…

2026/8/18 23:23:10 阅读更多 →
Cookie全流程实战:从编码原理到安全实践,解决中文乱码与跨域传递

Cookie全流程实战:从编码原理到安全实践,解决中文乱码与跨域传递

1. 项目概述:从“Cookie中文”说起,一个被误解的实战话题 最近在和一些刚入行的朋友交流时,发现一个挺有意思的现象:很多人一看到“Cookie的发送、获取、Cookie传递中文”这个标题,第一反应是去研究Cookie里怎么存中文…

2026/8/18 23:23:10 阅读更多 →
Altium Designer快捷键全解析:从原理图到PCB的高效设计指南

Altium Designer快捷键全解析:从原理图到PCB的高效设计指南

1. 项目概述:为什么AD软件的快捷键值得你花时间掌握? 如果你是一名电子工程师,或者正在学习PCB设计,那么Altium Designer(简称AD)这款软件对你来说一定不陌生。它功能强大,但界面也相对复杂。很…

2026/8/18 23:23:10 阅读更多 →
深入解析PCI-E接口:从核心架构到实战调优的完整指南

深入解析PCI-E接口:从核心架构到实战调优的完整指南

1. 项目概述:从“插槽”到“高速公路”的认知升级 如果你拆开过近十年的台式机或者服务器,在主板上除了CPU插槽和内存条插槽,最显眼的就是那些长短不一的扩展插槽了。其中最长的、尾部带有一个卡扣的,大概率就是PCI-E插槽。很多朋…

2026/8/18 23:22:09 阅读更多 →

日新闻

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 如果你还停留在"看网课 不停暂停 截图 …

2026/8/18 0:00:57 阅读更多 →
思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是不是也经历过这种时刻:设计稿里…

2026/8/18 0:00:58 阅读更多 →
华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, …

2026/8/18 0:00:59 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/18 9:15:35 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/18 9:06:28 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/18 9:04:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →