MySQL事务提交流程时序图
网上的资料有点乱,所以特画此图,来看事务操作的主要流程,此图为事务处理的简化时序图,在处理细节上省略了和多线程复制相关的操作,innodb各个阶段的详细操作,重在说明流程。
一、简化版的事务处理时序图
时序图说明
关于此图的必要性说明
- 如果你想了解group commit的详细机制,此图不适合,因为此图忽略了组提交的细节。
- 如果你想了解Innodb落盘机制,此图不适合,因为也忽略了。
- 此图基于Oracle MySQL-5.7.18 社区版
- 省略了server通过handler操作storage在整个事务处理过程中的关系
- 省略了innobase的各个阶段的详细操作
- TC_LOG在MySQL开启binlog时,其实就是MYSQL_BIN_LOG,MYSQL_BIN_LOG同时作为事务协调者和事务参与者,所以图中存在TC这个层级,所有TC的处理其实是MYSQL_BIN_LOG的处理,TC封装了接口供上层调用。
- 资源管理器并不是向TC注册,但是此图省略了这部分内容,显示为向TC注册。因为最终在事务提交操作时,TC会遍历资源管理器来进行操作。
- 此图在缺少本说明的情况下,不要随意复制粘贴,以免引起读者的误会。
- 此图源自于源码,但是不涉及源码。
- 能力有限,对于代码的理解也有限,画图水平更有限,有错误请指正。
时序图如下:

二、流程简介
如下是对时序图的简要说明,不会涉及太多细节,可以说基本没有涉及细节部分。
用户下发begin操作
如果在begin操作前,存在显示开启的未提交的事务,则begin操作会触发之前事务的提交,对这种情况不进行说明。
客户端下发begin操作时,server会去检测事务开启的参数,可以见help。begin在存储引擎不会做任何实质性的操作,但是MySQL处理完begin后,也会去调用tc commit操作,调用检测用户无任何写入操作既返回。(忽略部分细节,详细可看代码)
用户进行dml操作
用户下发dml数据写入操作,此时资源管理器进行注册,并且开始工作,比如innobase注册后处理真正的undo,redo,数据页变更操作。MYSQL_BIN_LOG注册后处理记录二进制日志。
随后是prepare动作,由于是非commit,非自动提交,所以此时binlog的prepare是获取当前最大事务提交数量(和多线程复制相关),不做真正的binlog落盘操作,innobase的prepare记录事务回滚点位,其实就是下一条sql如果失败了需要根据undo进行回滚,但是要知道回滚到什么位置,,不做redo的刷盘操作。
用户下发commit
客户端下发commit命令,此时进入真正的两阶段提交,两阶段提交分为prepare和commit两个阶段
-
prepare
prepare分为binlog prepare和innobase prepare,其中binlog prepare几乎不做操作,innobase prepare会更新事务状态。 -
commit
commit阶段被分为了三个阶段,分别是flush,sync,commit。其中 flush操作会进行线程binlog cache的文件写入,再将用户binlog cache刷新到文件;sync操作负责binlog的落盘;commit操作负责更新server层的最大事务提交数量(和并行复制相关),然后innobase 再次更新事务状态。提交结束。
源码分析的话可能要写的很久很长,另外一篇再介绍吧。
本文通过简化版的时序图,详细介绍了MySQL事务的提交流程,包括begin、DML操作、prepare和commit阶段。重点阐述了两阶段提交的过程,涉及到binlog和InnoDB存储引擎的操作,但未涵盖组提交和InnoDB的详细落盘机制。

1754

被折叠的 条评论
为什么被折叠?



