MySQL事务提交流程(2pc)时序图

本文通过简化版的时序图,详细介绍了MySQL事务的提交流程,包括begin、DML操作、prepare和commit阶段。重点阐述了两阶段提交的过程,涉及到binlog和InnoDB存储引擎的操作,但未涵盖组提交和InnoDB的详细落盘机制。

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 再次更新事务状态。提交结束。

源码分析的话可能要写的很久很长,另外一篇再介绍吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值