@Transaction事务导致的mysql连接耗尽源码分析

news2024/11/15 19:36:13

背景:

@Transaction注解是我们在日常的写代码过程中最常使用的事务注解了,本文就从spring源码的角度解析下这个注解的执行过程,以便分析为什么使用事务比正常的单sql执行更容易导致连接池耗尽

源码追踪:

本文假定使用PROPAGATION_REQUIRED (默认)的事务传播,@Transaction的执行过程的伪代码如下所示:

1.从mysql连接池中获取一条db连接,自此该连接被绑定到当前事务中.
2.执行connection.setAutoCommit(false),即关闭自动事务提交功能
3.执行@Transaction注解的方法,如果执行中途有回滚类的异常,那么走第4步的逻辑,否认走第5步的逻辑
4.执行connection.rollback异常回滚sql操作
5.执行正常的connection.commit事务提交
6.恢复数据库连接的connection.setAutoCommit(true)的自动事务提交功能
7.把connection数据库连接归还给连接池中

TransactionAspectSupport类几乎实现了以上的所有伪代码
在这里插入图片描述
以上就是@Transaction注解的大概代码执行流程

问答:

1.为什么大事务会引起db连接池耗尽
答:从源码中明显可以看出,再执行事务之前获取到的数据库连接会一直持有直到事务结束,这期间该连接是不会释放的,所以大事务容易引起DB连接池耗尽

2.@Transaction异常回滚后,外层调用@Transaction的方法还能获取到异常对象吗?
在这里插入图片描述
看图,显然,sql回滚后还是会把异常向外抛出.

3.同一类中方法调用@Transaction注解的事务方法无效?

是的,而且不管这个类是JDK动态代码实现的AOP还是CGLIB动态修改类实现的AOP,同一个类内方法调用另一个事务方法就是无效

@Transactional(rollbackFor = {Exception.class})
public boolean insertException() {
    boolean saveSuccess = dao.insert(record) > 0;
    System.out.println(1/0);
    return saveSuccess;
}

public boolean insertCaller(Integer ruleId, Integer ruleType) {
    return insertException(ruleId, ruleType);
}

比如,如上代码所示,直接调用insertException方法,是可以异常回滚的,但是如果调用insertCaller方法,事务是无效的,记录会被正常插入.

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

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

相关文章

音频怎么转文字?试试这三个简单的方法吧!

有时候我们会遇到一些比较重要的会议、讲座或者演讲,如果我们能够将这些声音记录下来,并将其转换为文字,就可以更加方便地保存和管理这些信息。这样,我们就不用再去听录音了,只需要看文字就可以了。此外,录…

智能指针的deleter机制

一、介绍 智能指针的deleter机制是指,当智能指针的引用计数降为0时,智能指针会自动调用一个指定的析构函数(deleter)来释放所管理的内存。这个析构函数通常是一个函数对象,可以是一个函数指针、一个lambda表达式或者一…

青少年机器人技术一级考试备考重点(四):功与能量以及常用传动装置

随着机器人技术的飞速发展,越来越多的青少年开始关注并参与其中。青少年机器人技术考试作为一项评估学生机器人技术水平的重要考试,备受广大青少年和家长的关注。为了更好地备战青少年机器人技术一级考试,了解考试的学习要点和备考重点是非常…

C++数据结构X篇_07_C++单向循环链表解决约瑟夫问题

本篇参考单向循环链表解决约瑟夫问题(C)整理,先搞懂结构框架,后期根据视频利用c对内容实现,也可以对c有更高的提升。 文章目录 1. 链表创建与初始化2. 添加插入、删除和打印函数3. 插入数据并核验4. 解决约瑟夫问题&am…

DM8:达梦数据库备份还原报错-文件已存在 -4558 file exists

DM8:达梦数据库备份还原报错-文件已存在 -4558 file exists 1 文件已存在 -4558 file exists2 使用 OVERWRITE 参数对数据库还原3 参数介绍 1 文件已存在 -4558 file exists 在数据库还原操作时,遇到报错文件已存在 -4558 file exists,可以使用OVERWRIT…

IP归属地与IP定位

IP归属地查询是指根据给定的IP地址,确定该IP地址所属的地理位置或网络服务提供商。这种查询可以帮助用户了解到访者的地理位置,有助于网络安全、反垃圾邮件等应用。 在实际应用中,IP归属地查询常用于以下几个方面: 网络安全&…

vcruntime140_1.dll详细修复方法(推荐使用这个方法)

vcruntime140_1.dll丢失要怎么办?其实很多人都在头疼这个问题,关于dll文件的丢失这事情是时常发生的,因为电脑的杀毒软件有时候会误杀,然后就会导致你的游戏程序都打开不了,你必须要修复好了才行,今天小编就…

【UE5 Cesium】09-Cesium for Unreal 子关卡应用实例(下)

效果 通过按钮点击事件实现子关卡的切换 步骤 新建两个Actor蓝图作为GeoMarker,分别命名为“BP_GeoMarker_BeiJing”、“BP_GeoMarker_ShangHai” 分别打开这两个蓝图,添加文本渲染组件 在指定的地理位置上拖入蓝图“BP_GeoMarker_BeiJing” 控制“BP_…

分布式缓存系统热点数据

一、背景 分布式缓存一般被定义为一个数据集合,它将数据分布(或分区)于任意数目的集群节点上。集群中的一个具体节点负责缓存中的一部分数据,整体对外提供统一的访问接口 Amazon 于 2007 年提出的一种改进的一致性哈希算法 [4]。…

华为OD机试真题 Java 实现【查找单入口空闲区域】【2022 Q4 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 一、题目描述 给定一个 m x n 的矩阵,由若干字符 ‘X’ 和 ‘O’构成,’X’表示该处已被占据,’O’表示该处空闲,请找…

【JS】将表格数据下载为 .csv 文件

文章目录 代码实现 代码实现 1. 将表格数据转换为字符串格式 2. 字符串格式里面的,逗号表示换列 3. 字符串格式里面的\n符号表示换行实现 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><…

Linux(包括centos) 如何查看服务器内存、CPU

CPU架构 CPU架构主要包括&#xff1a;amd64、arm32v7、arm64v8、mips64el、mips32、ppc64le和ppc32等架构。 CPU信息 CPU信息主要为中央处理器详细信息&#xff0c;包括&#xff1a; 架构核心数量处理速度厂商名称CPU主频标签 … 注&#xff1a;不同的操作系统或者CPU架构提供…

怎么提取视频中的音频?这些提取音频方法很简单

将视频中的音频提取出来&#xff0c;可以单独对音频进行处理&#xff0c;如剪辑、增强声音等&#xff0c;而不影响视频本身的内容。在后期制作中&#xff0c;音频需要经过一系列的处理&#xff0c;如去噪、降噪、混响等&#xff0c;提取出音频可以更方便地进行这些处理&#xf…

MHA高可用

文章目录 MHA高可用1 定义2 组成3 特点4 搭建MySQL MHA4.1 配置主从复制4.2 关闭防火墙&#xff0c;安全机制4.3 修改Master、Slave1、Slave2节点的主机名4.4 添加主机映射关系4.5 修改 Master、Slave1、Slave2 节点的 Mysql主配置文件/etc/my.cnf4.6 在master、slave1、slave2…

2023年--上半年小程序团队工作总结

前言 大家好&#xff0c;这是小程序团队第一次跟大家见面。小程序团队从2020年开始&#xff0c;就着手进行着小程序的开发。 在2020年7月上线了第一个现在仍在使用的上古小程序&#xff1a;课程小程序 和 我的内容库小程序。 小伙伴们可能还不知道&#xff0c;你们平时日常在cs…

10分钟看透微信公众号支付

开发痛点 如何配置微信&#xff1f;怎么个流程&#xff1f;怎么入手&#xff1f;如何本地调试&#xff1f;网上教程10个小时不想看怎么办&#xff1f;这里一篇文章带你入手微信支付。看看微信公众号支付到底有什么神奇之处。 开发后结果 微信配置 1、首先打开文档中心&#…

dy系点选验证码协议2023/07/3 一直可用

前言 可以关注我哟,一起学习,主页有更多练习例子 如果哪个练习我没有写清楚,可以留言我会补充 如果有加密的网站可以留言发给我,一起学习共享学习路程 如侵权,联系我删除 此文仅用于学习交流,请勿于商用,否则后果自负 因为需求不得不搞,小白一个,哪有不对,大佬多多…

Linux 学习记录44(C++篇)

Linux 学习记录44(C篇) 本文目录 Linux 学习记录44(C篇)一、静态成员变量/函数1. 静态成员变量2. 静态成员函数 二、继承1. 继承的作用2. 继承的格式3. 子类对父类中成员的继承4. 子类中存在和父类同名成员时5. 继承中特殊的成员函数(1. 构造函数(2. 析构函数(3. 拷贝构造函数(…

OpenAI遭集体诉讼!窃取数百万用户信息?明星大模型变“数据小偷”!

“尽管制定了购买和使用个人信息的协议&#xff0c;但被告采取了不同的方法&#xff1a;窃取。”近日&#xff0c;一家律师事务所用一份长达157页的诉讼将OpenAI告到法庭&#xff0c;指控其在利润的驱使下&#xff0c;窃取大量个人信息来训练人工智能模型。 起诉书称&#xff0…

UE4 TCP通信 (UE作为客户端接收字节)

在上一篇(UE4 TCP通信)基础上,实现UE客户端接收服务端推送的字节数据并解析。 效果 (注意看左上角的打印信息) 步骤 1. 首先新建一个工程,然后创建一个Actor蓝图,这里命名为“BP_TCPConnect” 打开“BP_TCPConnect”,添加如下节点: (1)当服务端与客户端断开连接时…