Spring事务管理实现机制
Spring通过一系列精妙的抽象和实现来完成事务的融入、挂起和嵌套操作。下面我将详细解析Spring如何实现这些事务行为。
1. 核心组件
Spring事务管理的核心组件包括:
-
PlatformTransactionManager:事务管理器的抽象接口
-
TransactionDefinition:定义事务属性(传播行为、隔离级别等)
-
TransactionStatus:表示事务状态
-
TransactionSynchronizationManager:事务同步管理器(线程绑定资源管理)
2. 事务融入(REQUIRED)实现
当传播行为为PROPAGATION_REQUIRED时:
// 简化版AbstractPlatformTransactionManager处理逻辑
if (isExistingTransaction(transaction)) {// 已存在事务:融入现有事务return handleExistingTransaction(def, transaction, debugEnabled);
} else {// 不存在事务:创建新事务return startTransaction(def, transaction, debugEnabled, suspendedResources);
}
融入过程:
-
通过TransactionSynchronizationManager判断当前线程是否已有事务
-
如果有,获取当前事务信息并加入
-
通过线程绑定机制(ThreadLocal)共享同一事务资源
3. 事务挂起(REQUIRES_NEW/NOT_SUPPORTED)实现
当传播行为需要挂起当前事务时:
// 挂起当前事务的典型实现
protected final SuspendedResourcesHolder suspend(@Nullable Object transaction) {// 1. 从当前线程解绑事务资源List<TransactionSynchronization> suspendedSynchronizations = TransactionSynchronizationManager.getSynchronizations();// 2. 解绑所有事务相关资源Map<Object, Object> suspendedResources = TransactionSynchronizationManager.unbindResource(obtainTransactionSynchronizationRegistry());// 3. 重置线程绑定状态TransactionSynchronizationManager.clear();return new SuspendedResourcesHolder(suspendedResources, suspendedSynchronizations);
}
挂起过程:
-
保存当前事务状态到SuspendedResourcesHolder
-
从TransactionSynchronizationManager清理线程绑定
-
后续操作将在无事务或新事务中执行
4. 事务嵌套(NESTED)实现
对于PROPAGATION_NESTED的实现:
// DataSourceTransactionManager中的实现
if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) {if (!useSavepointForNestedTransaction()) {throw new NestedTransactionNotSupportedException(...);}// 创建保存点Object savepoint = getSavepointManager().createSavepoint();return prepareTransactionStatus(definition, transaction, false, true, debugEnabled, savepoint);
}
嵌套实现关键点:
-
检查数据库是否支持保存点
-
通过JDBC Savepoint机制实现
-
内部事务回滚只回滚到保存点
-
外部事务回滚会导致全部回滚
5. 底层实现技术
Spring实现这些行为的底层技术包括:
5.1 线程绑定机制
-
使用TransactionSynchronizationManager维护线程绑定资源
-
基于ThreadLocal存储当前事务状态
-
关键方法:bindResource/unbindResource
5.2 JDBC抽象
-
对Connection的包装(TransactionAwareDataSourceProxy)
-
保存点管理(通过Connection#setSavepoint)
-
事务隔离级别控制
5.3 事务同步
-
TransactionSynchronization接口
-
注册回调处理(如afterCommit, afterCompletion)
-
保证资源清理和状态恢复
6. 典型处理流程
// 简化版事务处理流程
public final TransactionStatus getTransaction(TransactionDefinition definition) {// 1. 获取或创建事务Object transaction = doGetTransaction();// 2. 检查当前线程是否已有事务if (isExistingTransaction(transaction)) {// 处理已存在事务的情况(融入/挂起/嵌套等)return handleExistingTransaction(definition, transaction, debugEnabled);}// 3. 处理无事务的情况return startTransaction(definition, transaction, debugEnabled, null);
}
7. 不同传播行为的实现对比
传播行为 | 实现机制 |
---|---|
REQUIRED | 加入现有事务或新建事务(线程绑定同一Connection) |
REQUIRES_NEW | 挂起当前事务→新建事务→新Connection绑定到线程→原事务保存在SuspendedResourcesHolder |
NESTED | 使用JDBC Savepoint机制(不创建新Connection) |
NOT_SUPPORTED | 挂起当前事务→无事务执行→恢复原事务 |
MANDATORY | 强制检查当前是否存在事务 |
8. 事务恢复机制
当事务挂起后需要恢复时:
protected final void resume(@Nullable Object transaction, @Nullable SuspendedResourcesHolder resourcesHolder) {if (resourcesHolder != null) {// 恢复线程绑定的资源TransactionSynchronizationManager.bindResource(obtainTransactionSynchronizationRegistry(), resourcesHolder.getSuspendedResources());// 恢复同步器resourcesHolder.register();}
}
Spring通过这些精细的控制机制,实现了灵活的事务传播行为,为复杂业务场景提供了可靠的事务管理能力。
相关文章:
Spring事务管理实现机制
Spring通过一系列精妙的抽象和实现来完成事务的融入、挂起和嵌套操作。下面我将详细解析Spring如何实现这些事务行为。 1. 核心组件 Spring事务管理的核心组件包括: PlatformTransactionManager:事务管理器的抽象接口 TransactionDefinitionÿ…...
[面试]SoC验证工程师面试常见问题(七)低速接口篇
SoC验证工程师面试常见问题(七)低速接口篇 摘要:低速接口是嵌入式系统和 SoC (System on Chip) 中常用的通信接口,主要用于设备间的短距离、低带宽数据传输。相比高速接口(如 PCIe、USB 3.0),低速接口的传输速率较低(通常在 kbps 到几 Mbps 范围),但具有简单…...

虚假AI工具通过Facebook广告传播新型Noodlophile窃密木马
网络安全公司Morphisec的研究人员发现,攻击者正利用虚假人工智能(AI)平台传播名为Noodlophile Stealer的新型信息窃取木马。这种复杂攻击手法利用AI工具的热度诱骗用户下载恶意软件,窃取浏览器凭证、加密货币钱包,并可…...
【Qt】之【Bug】点击按钮(ui->pushButton)触发非本类设置的槽函数
解决 先说解决办法,按钮在ui为默认命名ui->pushButton,后面改了下按钮名为该按钮的功能相关,就不会随意触发其他槽函数了。 没想到是这个原因。。。 可能是之前默认的objectName与旧的槽函数自动连接了 记录一下,找了好久其他的原因。 以…...
Metasploit 4.22.7:企业级渗透测试新突破
前言 Metasploit作为全球最受欢迎的渗透测试框架,其最新版本4.22.7-2025050101带来了企业级开发的全新可能。 本文将从框架基础架构、模块类型与开发规范入手,逐步深入企业级功能如MetaModules任务重放和自动化测试,最终通过实战案例展示如何利用最新功能开发高效漏洞利用模…...
【LeetCode 热题 100】215. 数组中的第K个最大元素(Python 快速选择详解)
在刷 LeetCode 的过程中,“第K大”是一个非常高频的考点,而题目 215. 数组中的第K个最大元素 就是经典代表。这道题不仅考察我们对排序的理解,还挑战我们写出时间复杂度为 O(n) 的算法。 本文将带你深入理解并实现一个基于快速选择ÿ…...

麦科信获评CIAS2025金翎奖【半导体制造与封测领域优质供应商】
在苏州举办的2025CIAS动力能源与半导体创新发展大会上,深圳麦科信科技有限公司凭借在测试测量领域的技术积累,入选半导体制造与封测领域优质供应商榜单。本届大会以"新能源芯时代"为主题,汇集了来自功率半导体、第三代材料应用等领…...

指针运算典型例题解析
1.题目1 该代码运行的结果是什么? #include <stdio.h> int main() { int a[5] { 1, 2, 3, 4, 5 }; int *ptr (int *)(&a 1); printf( "%d,%d", *(a 1), *(ptr - 1)); return 0; } 解析: 运行结果: 2.题目2 在X86…...

DAX 权威指南1:DAX计算、表函数与计算上下文
参考《DAX 权威指南 第二版》 文章目录 二、DAX简介2.1 理解 DAX 计算2.2 计算列和度量值2.3 变量2.3.1 VAR简介2.3.2 VAR的特性 2.4 DAX 错误处理2.4.1 DAX 错误类型2.4.1.1 转换错误2.4.1.2 算术运算错误2.4.1.3 空值或 缺失值 2.4.2 使用IFERROR函数拦截错误2.4.2.1 安全地进…...

使用 NV‑Ingest、Unstructured 和 Elasticsearch 处理非结构化数据
作者:来自 Elastic Ajay Krishnan Gopalan 了解如何使用 NV-Ingest、Unstructured Platform 和 Elasticsearch 为 RAG 应用构建可扩展的非结构化文档数据管道。 Elasticsearch 原生集成了行业领先的生成式 AI 工具和提供商。查看我们的网络研讨会,了解如…...

20250508在WIN10下使用移远的4G模块EC200A-CN直接上网
1、在WIN10/11下安装驱动程序:Quectel_Windows_USB_DriverA_Customer_V1.1.13.zip 2、使用移远的专用串口工具:QCOM_V1.8.2.7z QCOM_V1.8.2_win64.exe 3、配置串口UART42/COM42【移远会自动生成连续三个串口,最小的那一个】 AT命令…...

C++(6):逻辑运算符
目录 1. 代码示例 示例 1:基础用法 示例 2:条件判断 2. 短路求值(Short-Circuit Evaluation) 代码示例 3. 实际应用场景 场景 1:输入合法性验证 场景 2:游戏状态判断 4. 注意事项 逻辑运算符用于组…...

NXP iMX8MP ARM 平台多屏幕克隆显示测试
By Toradex秦海 1). 简介 NXP i.MX8MP ARM SoC 支持 3 路 Display Controller 分别提供 DSI/HDMI/LVDS 显示输出,在 Yocto Linux BSP 下采用 Wayland Backend 基于 DRM subsystem 显示驱动,前端默认基于 Weston Compositor。因此在默认情况下连接多个屏…...
探秘 Canva AI 图像生成器:重塑设计创作新范式
Canva 凭借简洁易用的界面和海量模板资源,早已成为设计师和普通用户的心头好。而 Canva AI 图像生成器的推出,更是为设计领域带来了一场深刻变革,以智能化的手段重塑了图像创作的方式与边界。 技术内核:AI 如何驱动图像生成 Can…...

【数据结构】——栈
一、栈的概念和结构 栈其实就是一种特殊的顺序表,其只允许在一端进出,就是栈的数据的插入和删除只能在一端进行,进行数据的插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的元素遵循先进后出LIFO(Last InFirst O…...

Navicat中保存的数据库密码找回 Java 8
导出数据库连接打开导出的connections.ncx文件找到加密的password放入java程序中解密即可 package com.asia.card.cloud.enterprise.api;import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.cha…...
构件是一个逻辑概念,还是一个物理概念?
在软件架构中,构件(Component)既可以是逻辑概念,也可以是物理概念,具体取决于上下文和系统设计的需求。以下是两种视角的详细分析: 1. 逻辑概念(抽象层面) 定义:构件是系统功能的逻辑划分,表示一组相关的职责或行为,不直接对应物理实现。 …...

vs code管理员权限启动问题
vs code非管理员启动可以正常启动用管理员启动vs code,会提示 解决办法 找到argv.json文件在argv.json文件中添加 "disable-chromium-sandbox": true重启vs code即可...

Spring Cloud与Service Mesh集成:Istio服务网格实践
文章目录 引言一、Spring Cloud与Service Mesh概述二、Istio服务网格架构三、Spring Cloud与Istio集成的基础设施准备四、服务发现与负载均衡五、流量管理与弹性模式六、安全通信与认证授权七、可观测性集成八、配置管理集成总结 引言 微服务架构已成为现代分布式系统的主流设…...
20250510-查看 Anaconda 配置的镜像源
打开 Anaconda Prompt 查看 Anaconda 当前配置的镜像源,使用命令 conda config --show channels这将显示当前配置的通道(channels),即镜像源列表。 此外,还可以使用 conda config --show命令来显示conda的配置信息&…...

React+Taro选择日期组件封装
话不多说,直接上效果 1.页面渲染时间模块 {this.renderCalendarPopup()}2.引入时间组件弹层,state中加入showPopup(控制什么时候展示时间选择弹层),time(选择后的时间值) private renderCalendarPopup () > {const { showPopup, time…...

C++进阶--AVL树的实现续
文章目录 C进阶--AVL树的实现双旋AVL树的查找AVL树的检验结语 很高兴和搭大家见面,给生活加点impetus,开启今天的比编程之路!! 今天我们来完善AVL树的操作,为后续红黑树奠定基础!! 作者&#x…...

AutoGen+Deepseek+chainlit的简单使用
AutoGen 的应用场景 AutoGen 作为一个强大的多智能体协作框架,可用于多种复杂任务: 自动化工作流:构建由多个智能体组成的流水线,例如数据收集、分析、报告生成复杂问题分解:将难题拆解为子任务,分配给不…...

采用SqlSugarClient创建数据库实例引发的异步调用问题
基于SqlSugar编写的多个WebApi接口,项目初始化时采用单例模式注册SqlSugarClient实例对象,前端页面采用layui布局,并在一个按钮事件中通过Ajax连续调用多个WebApi接口获取数据。实际运行时点击按钮会随机报下面几种错误: Execute…...

第7次课 栈A
课堂学习 栈(stack) 是一种遵循先入后出逻辑的线性数据结构。 我们可以将栈类比为桌面上的一摞盘子,如果想取出底部的盘子,则需要先将上面的盘子依次移走。我们将盘子替换为各种类型的元素(如整数、字符、对象等&…...
部署RocketMQ
部署环境:jdk8以上,Linux系统 下载和安装指令: wget https://archive.apache.org/dist/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip 显示下载成功: --2025-05-10 11:34:46-- https://archive.apache.org/dist/rocketm…...

软考-软件设计师中级备考 13、刷题 数据结构
倒计时17天时间不多了,数据库、UML、等知识点有基础直接略过,法律全靠考前的一两天刷题,英语直接放弃。 一、数据结构:链表、栈、队列、数组、哈希表、树、图 1、关于链表操作,说法正确的是: A)新增一个头…...

centos的根目录占了大量空间怎么办
问题 当根目录磁盘不够时,就必须删除无用的文件了 上面的,如果删除/usr 或/var是可以释放出系统盘的 定位占空间大的文件 经过命令,一层层查哪些是占磁盘的。 du -sh /* | sort -rh | head -n 10 最终排查,是有个系统日志占了20…...

电子电器架构 --- 新能源高压上下电那点事一文通
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

每日算法-250510
每日算法学习记录 - 250510 1. LeetCode 2086. 喂食仓鼠的最小食物桶数 题目描述: 解题思路 这是一个典型的贪心问题。我们的目标是用最少的食物桶喂饱所有仓鼠。 解题过程 核心思想是:当遇到一只仓鼠时,如何放置食物桶才能最有效地利用这个桶。 …...