news 2026/5/2 16:27:41

MySQL长时间未提交事务分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL长时间未提交事务分析

在数据库运维经验中,经常处理的一类故障性能问题就是长时间未提交事务。在换版日,常常有开发同事找过来,说执行DDL操作时候,报锁超时。而绝大部分大部分DDL锁超时问题都是由长时间未提交事务引起的。所以,不管是做开发的朋友,还是数据库运维的朋友,都应该对长时间未提交事务有所了解,并尽量避免。本文介绍长时间未提交事务的原因、造成的故障、优化方案。

一、什么是长时间未提交事务

未提交事务指的是显示开启的事务中,sql执行完很长时间后,仍然未执行commit。这里要和大事务做一个区分,大事务指的是一个事务操作的行记录数较多,并且执行时间较长。一般是由DBever客户端发起的sql,容易造成长时间未提交事务。长时间未提交事务一般是从DBever客户端发起的select语句,日常可能只是查询一些库、表信息,然后忘了关闭客户端,sql执行完了,但事务没有提交。

二、长时间未提交事务造成的危害

1、元数据锁冲突

今天时间有限,这里我们留到下次讲解,给大家留一个悬念。

2、主从延迟陡增陡降

我在“MySQL数据库binlog解析”这篇文章中总结过,每生成一个新的binlog,至少包含2个event,第一个是FORMAT_DESCRIPTION_EVENT,第二个是PREVIOUS_GTIDS_LOG_EVENT。当执行了DML语句或者DDL语句之后,则会先生成GTID_EVENT或者Anonymous_GTID_EVENT,接着是对应事务begin语句的QUERY_EVENT、MAP_EVENT以及sql语句对应的WRITE_EVENT/DELETE_EVENT/UPDATE_EVENT,最后是对应事务commit语句的XID_EVENT。每产生一个事务,主库就会对应生成一系列的EVENT,每个EVENT都有一个时间戳。长时间未提交事务造成主从延迟陡增陡降的根本原因,其实就是这些EVENT的时间戳差异。这些EVENT按照先后顺序整理出来如下。

1)PREVIOUS_GTIDS_LOG_EVENT:记录了Previous-GTIDS,描述前面所有binlog包含的gtid set。对应的时间戳简单理解为事务begin的时间。

2)GTID_EVENT:描述组提交中的逻辑时钟相关信息,即last commit和seq number,这两个值是从库回放事务时能否并行回放的依据,对应的时间戳为事务commit的时间。

3)QUERY_EVENT:记录语句的运行环境,比如说客户端字符集、SQL_MODE等信息,同时还会记录执行时间。对于DML语句,会记录sql语句更改第一行数据时候都时间,语句部分记录的是“begin”;对于DDL语句,记录的是sql真正开始执行的时间,语句记录的是DDL语句本身。这对应的时间戳简单理解为事务begin的时间。

4)MAP_EVENT:行模式特有的事件,记录表在数据库内部映射的table id。对应的时间戳简单理解为事务begin的时间。

5)WRITE_EVENT/DELETE_EVENT/UPDATE_EVENT:这些是真正执行insert、delete、update语句产生的EVENT。对应的时间戳简单理解为事务begin的时间。

6)XID_EVENT:携带XID的EVENT,XID是数据库在两阶段提交策略中用来判断一个事务是需要回滚还是重做的重要依据。记录的语句为“commit”,对应的时间戳为事务commit的时间。

主库显式发起一个事务后,在事务执行过程中就会在数据库缓存中生成对应的EVENT,当事务执行commit后,这些EVENT会从主库通过binlog转储线程,发送到从库。从库接收到EVENT后,会开始回放这些EVENT。而从库的主从延迟计算公式:从库的系统时间-正在回放的EVENT的时间戳-主从时间差,用符号代替即为Seconds_beind_master=T0 - T1 - DIFF。其中,DIFF是固定值,可以先忽略认为0。

假设一个长时间未提交事务,真正的sql执行时间很短,15点开始执行并且立刻就执行完成,等到17点才执行commit。在网络状态良好情况下,从库17点接收到对应事务EVENT,并开始回放。回放PREVIOUS_GTIDS_LOG_EVENT、GTID_EVENT、QUERY_EVENT、MAP_EVENT、WRITE_EVENT时都执行的相对较快,这里计算主从延迟的时候,T0值为17点,T1对应的时间都是15点,对应的主从延迟是T0 - T1 - DIFF=17-15-DIFF(0)=2小时即7200秒,也就是从库会在回放到WRITE_EVENT时,主从延迟瞬间冲高到7200秒,当从库回放到commit对应的XID_EVENT时,T0值还是17点,T1对应的时间都是17点,对应的主从延迟是T0 - T1 - DIFF=17-17-DIFF(0)=0,延迟瞬间降为0。

三、如何优化未提交事务

今天时间有限,这里我们留到下次讲解,给大家留一个悬念。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 20:22:22

OpenClaw多模型切换:Qwen3-14b_int4_awq与其他本地模型的协同使用

OpenClaw多模型切换:Qwen3-14b_int4_awq与其他本地模型的协同使用 1. 为什么需要多模型协同 在我的自动化工作流实践中,单一模型往往难以满足所有场景需求。比如处理代码生成任务时,我需要模型具备较强的逻辑推理能力;而在撰写自…

作者头像 李华
网站建设 2026/4/10 20:22:11

跨品牌摄像头统一管理:借助MiCam与go2rtc构建家庭RTSP流媒体中枢

1. 为什么需要跨品牌摄像头统一管理? 家里装了四五个不同品牌的摄像头,手机里塞满了各种监控APP——这可能是很多智能家居爱好者的真实写照。我去年装修新房时,前后安装了小米、TP-Link和海康威视三个品牌的摄像头,每天要切换三个…

作者头像 李华
网站建设 2026/4/10 20:21:47

小白必看:开箱即用的ClearerVoice-Studio,让模糊语音变清晰

小白必看:开箱即用的ClearerVoice-Studio,让模糊语音变清晰 1. 为什么你需要这个语音处理神器 想象一下这样的场景:你刚参加完一场重要的线上会议,却发现录音里充满了键盘敲击声和背景噪音;或者你翻出多年前的家庭录…

作者头像 李华
网站建设 2026/4/10 20:21:21

多租户下的系统业务开发过程探讨赜

一、背景与问题缘起 MySQL 5.6.51 版本下 2000 万行核心业务表开展新增字段操作,需求为新增BIGINT(19) NOT NULL DEFAULT 0 COMMENT 注释(因业务实际需要存储大数值关联字段)。 表的核心特性为Java 多线程密集读写,业务请求持续高…

作者头像 李华
网站建设 2026/4/10 20:21:17

HTML怎么创建会话超时倒计时提醒_HTML剩余时间动态更新【说明】

JavaScript实现会话超时倒计时需用setTimeout递归更新DOM,监听click/keydown/scroll/focus事件重置;结合document.hidden控制可见性,调用服务端keepalive接口校准时间,降级使用本地计时并兼容IE11。怎么用 JavaScript 实现页面会话…

作者头像 李华
网站建设 2026/4/10 20:20:25

OpenSpec、Superpowers 和 Harness:AI 工程化开发的三层拼图

AI 编程从"让模型写代码"走向"让模型像团队一样开发",中间差的不是更强的模型,而是三层工程基础设施:OpenSpec 管"做什么",Superpowers 管"怎么做",Harness 管"谁来做、…

作者头像 李华