04-深入解析 Spring 事务管理原理及源码

深入解析 Spring 事务管理原理及源码

Spring 事务管理(Transaction Management)是企业级应用开发中至关重要的功能之一,它确保数据操作的 原子性、一致性、隔离性、持久性(ACID)

本篇博客将从 Spring 事务的基本概念 开始,深入 Spring 事务的实现机制,并对 @Transactional 注解的底层执行流程 进行源码级解析。


1. 事务的基本概念

在数据库操作中,事务是一个逻辑操作单元,必须满足 ACID 四大特性:

特性说明
原子性(Atomicity)事务内的所有操作要么全部成功,要么全部失败
一致性(Consistency)事务执行后,数据库从一个一致性状态转换到另一个一致性状态
隔离性(Isolation)并发事务相互隔离,防止数据不一致
持久性(Durability)事务提交后,数据永久保存到数据库

⚙️ 2. Spring 事务的核心组件

Spring 通过 声明式事务编程式事务 来管理数据库事务。

2.1 Spring 事务的核心接口

组件作用
PlatformTransactionManager事务管理器接口
DataSourceTransactionManager适用于 JDBC 的事务管理器
JpaTransactionManager适用于 JPA(Hibernate)的事务管理器
TransactionDefinition事务的定义,包括隔离级别、传播行为等
TransactionStatus事务的当前状态

3. @Transactional 注解解析

Spring 通过 @Transactional 注解实现 声明式事务,常见用法如下:

@Service
public class OrderService {@Transactionalpublic void createOrder() {// 事务开始orderDao.insertOrder();paymentDao.processPayment(); // 若失败,事务回滚// 事务提交}
}

3.1 @Transactional 支持的属性

属性说明
propagation事务传播行为
isolation事务隔离级别
timeout事务超时时间
readOnly是否为只读事务
rollbackFor指定哪些异常会触发回滚

4. Spring 事务管理的源码解析

Spring 事务管理的核心是通过 AOP(面向切面编程) 来实现的,底层依赖于 TransactionInterceptor 和 PlatformTransactionManager 来实现事务的创建、提交、回滚等操作。

4.1 事务的创建与提交流程

1️⃣ @Transactional 代理拦截
Spring 事务使用 AOP 代理 来拦截标注了 @Transactional 注解的方法,并通过 TransactionInterceptor 来处理事务的启动、提交和回滚。具体如下:


public Object invoke(MethodInvocation invocation) throws Throwable {return transactionInterceptor.invokeWithinTransaction(invocation.getMethod(), targetClass, invocation::proceed);
}

2️⃣ 获取事务管理器并创建事务
事务管理器(如 DataSourceTransactionManager)负责管理事务。在 doBegin() 方法中会启动一个新的事务:


@Override
protected void doBegin(Object transaction, TransactionDefinition definition) {Connection conn = DataSourceUtils.getConnection(dataSource);conn.setAutoCommit(false); // 关闭自动提交,开启事务
}

3️⃣ 执行业务逻辑
当事务开始后,Spring 会执行业务方法(invocation.proceed())。如果在业务逻辑执行过程中出现异常,则会触发回滚。

4️⃣ 提交或回滚事务
当方法执行完成后,事务会根据是否抛出异常来决定提交还是回滚:

@Override
protected void doCommit(DefaultTransactionStatus status) {status.getConnectionHolder().getConnection().commit();
}@Override
protected void doRollback(DefaultTransactionStatus status) {status.getConnectionHolder().getConnection().rollback();
}

5. 事务的传播机制

Spring 事务支持 7 种传播行为,用于控制当前事务如何传播到嵌套事务中。以下是最常用的几种传播行为及其实际应用:

传播行为实例
1️⃣ REQUIRED(默认行为
如果当前存在事务,则加入事务;如果当前没有事务,则新建事务。例如:


@Transactional(propagation = Propagation.REQUIRED)
public void method1() {// 当前存在事务,将加入该事务
}

如果 method1() 中调用了一个没有声明事务的方法 method2(),method2() 会加入到 method1() 的事务中。

2️⃣ REQUIRES_NEW
当前方法总是会新建一个事务,暂停当前事务。例如:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void method1() {// 新建一个事务,当前事务会被挂起
}

当 method1() 执行时,它会暂停外部事务,并在自身内部创建一个新的事务。

3️⃣ NESTED
在当前事务中创建一个嵌套事务。嵌套事务可以独立提交或回滚,但会共享外部事务的连接。例如:


@Transactional(propagation = Propagation.NESTED)
public void method1() {// 创建一个嵌套事务
}

嵌套事务在提交时不会影响外部事务,但可以独立回滚。

组合后的效果
REQUIRED + REQUIRES_NEW:会在外部事务的基础上创建新的事务,外部事务挂起,内部事务完成后恢复外部事务。

REQUIRED + NESTED:如果外部事务提交,嵌套事务也会提交;若外部事务回滚,嵌套事务也会回滚。

通过以上,应该可以很快了解Spring事务,也能更快的去排查跟定位问题。
如果你还有其他问题或想了解更多,欢迎留言交流! 😊

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

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

相关文章

【Linux】用户向硬件寄存器写入值过程理解

思考一下,当我们咋用户态向寄存器写入一个值,这个过程是怎么样的呢?以下是应用程序通过标准库函数(如 write()、ioctl() 或 mmap())向硬件寄存器写入值的详细过程,从用户空间到内核再到硬件的完整流程&…

自动驾驶02:点云预处理——02(运动补偿篇LIO-SAM)

当激光雷达(LiDAR)在运动中采集点云时,每个点的时间戳不同,而车辆在移动,导致点云在不同时间点的坐标与实际情况不符,这种现象称为运动畸变(Motion Distortion)。为了得到无畸变的点…

基础算法篇(3)(蓝桥杯常考点)—图论

前言 这期是基础算法篇的第三节,其中的dijkstra算法更是蓝桥杯中的高频考点 图的基本相关概念 有向图和无向图 自环和重边 稠密图和稀疏图 对于不带权的图,一条路径的路径长度是指该路径上各边权值的总和 对于带权的图,一条路径长度时指该路…

Crawl4AI:专为AI设计的开源网页爬虫工具,释放大语言模型的潜能

在当今数据驱动的AI时代,高效获取结构化网页数据是模型训练和应用落地的关键。Crawl4AI作为一款专为大型语言模型(LLMs)设计的开源爬虫工具,凭借其极速性能、AI友好输出和模块化设计,正在成为开发者社区的热门选择。本文将深入解析其核心特性与技术优势。 一、Crawl4AI的核…

前后端数据序列化:从数组到字符串的旅程(附优化指南)

🌐 前后端数据序列化:从数组到字符串的旅程(附优化指南) 📜 背景:为何需要序列化? 在前后端分离架构中,复杂数据类型(如数组、对象)的传输常需序列化为字符…

汇编学习之《移位指令》

这章节学习前需要回顾之前的标志寄存器的内容: 汇编学习之《标志寄存器》 算数移位指令 SAL (Shift Arithmetic Left)算数移位指令 : 左移一次,最低位用0补位,最高位放入EFL标志寄存器的CF位(进位标志) OllyDbg查看…

NLP高频面试题(二十九)——大模型解码常见参数解析

在大语言模型的实际应用中,如何更有效地控制文本生成的质量与多样性,一直是热门研究话题。其中,模型解码(decode)策略至关重要,涉及的主要参数包括 top_k、top_p 和 temperature 等。本文将详细介绍这些常见…

【C#】Task 线程停止

CancellationTokenSource cts 是用于控制任务(线程)停止运行的。我们一步步来解释它的作用。 🔍 现在的代码结构大概是这样的: Task.Run(() > {while (true){// 不断循环采集图像} });这种写法虽然简单,但最大的问…

WebRTC的ICE之TURN协议的交互流程中继转发Relay媒体数据的turnserver的测试

WebRTC的ICE之TURN协议的交互流程和中继转发Relay媒体数据的turnserver的测试 WebRTC的ICE之TURN协议的交互流程中继转发Relay媒体数据的turnserver的测试 WebRTC的ICE之TURN协议的交互流程和中继转发Relay媒体数据的turnserver的测试前言一、TURN协议1、连接Turn Server 流程①…

Redis + Caffeine多级缓存电商场景深度解析

Redis Caffeine多级缓存 Redis Caffeine多级缓存电商场景深度解析一、实施目的二、具体实施2.1 架构设计2.2 组件配置2.3 核心代码实现 三、实施效果3.1 性能指标对比3.2 业务指标改善3.3 系统稳定性 四、关键策略4.1 缓存预热4.2 一致性保障4.3 监控配置Prometheus监控指标 …

前端开发3D-基于three.js

基于 three.js 渲染任何画面,都要基于这 3 个要素来实现 1场景scene:放置物体的容器 2摄像机:类似人眼,可调整位置,角度等信息,展示不同画面 3渲染器:接收场景和摄像机对象,计算在浏…

代码随想录算法训练营--打卡day4

一.移除链表元素 1.题目链接 203. 移除链表元素 - 力扣(LeetCode) 2.思路 通过 while 循环来遍历链表,只要 cur 的下一个节点不为空,就继续循环。在循环中,对 cur 的下一个节点的值进行判断: 值不等于…

虚拟电厂:多元能源聚合,开启绿色电力新时代

虚拟电厂:多元能源聚合,开启绿色电力新时代 在“双碳”目标驱动下,电力系统正经历从集中式向分布式、从单一能源向多能互补的深刻变革。 作为能源互联网的核心载体,虚拟电厂通过数字化技术整合多种能源资源,而是像指…

高通Android10 铃声通话音频80%音量修改

先修改最高的音量step --- a/SC60_AP/frameworks/base/services/core/java/com/android/server/audio/AudioService.javab/SC60_AP/frameworks/base/services/core/java/com/android/server/audio/AudioService.java-311,14 311,14 public class AudioService extends IAudio…

类加载过程?类隔离了解过吗?

类加载过程详解 类加载是 JVM 将类的字节码从磁盘、网络或其他来源加载到内存,并转换为 Class 对象的过程,主要分为以下 五个阶段: 1. 加载(Loading) 任务:查找类的二进制字节流(如 .class 文…

使用msmtp和mutt在CentOS上发送指定目录下的所有文件作为邮件附件

1.安装 msmtp: 如果尚未安装,请先通过以下命令安装msmtp。 sudo yum install msmtp 2.配置 msmtp 使用新浪邮箱: 创建或编辑配置文件~/.msmtprc,输入以下内容(记得替换授权码)。 defaults tls on tls_st…

Vue+Elementui首页看板

源码 <template><!-- 查询条件--><div class="optimize-norm" v-loading="selectDataLoading"><el-form :model="queryParams" ref="queryRef" style="padding-bottom:8px" :inline="true"…

汇编学习之《指针寄存器大小端学习》

什么是指针寄存器&#xff1f; 操作栈的寄存器 栈&#xff1a; 保存函数里面传递的参数&#xff0c;局部变量等。 EBP&#xff1a; 指向栈底的指针 ESP&#xff1a; 指向栈顶的指针。 计算入栈地址变化规则 通过OllDbg查看 有可能点击安装的时候栈区域第一次查看会没有显…

Oracle数据库数据编程SQL<3.7 PL/SQL 触发器(Trigger)>

触发器是Oracle数据库中的一种特殊存储过程&#xff0c;它会在特定数据库事件发生时自动执行。触发器通常用于实现复杂的业务规则、数据验证、审计跟踪等功能。 目录 一、触发器基本概念 1. 触发器特点 2. 触发器组成要素 二、触发器类型 1. DML触发器 2. DDL触发器 3.…

2025年渗透测试面试题总结-某 携程旅游-基础安全工程师(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 携程旅游-基础安全工程师 反序列化原理 核心原理 扩展分析 SQL注入本质 核心原理 扩展分析 SQL注…