MySQL数据库中的两阶段提交,不知道您知道不?这篇文章就简单的聊一聊MySQL数据库中的两阶段提交,两阶段提交发生在数据变更期间(更新、删除、新增等),两阶段提交过程中涉及到了MySQL数据库中的两个日志系统:redo日志和binlog文件。
redo日志前面已经介绍过了,就不再介绍了,简单的聊一聊binlog文件,binlog是MySQLserver层提供的二进制文件,因此所有的存储引擎都可以使用binlog功能,binlog是追加写的逻辑日志,记录了执行语句的原始逻辑,文件写到指定大小后会切换到下一个文件继续写,并不会覆盖以前写过的日志文件。
binlog日志文件主要用于数据恢复和集群环境下各服务器之间的数据同步,在工作中,我们误删了数据或者表之类,如果需要恢复的话都是利用binlog日志来恢复的,所以binlog日志是MySQL数据库中比较重要的模块。
知道这两个日志之后,我们把重点回到MySQL数据库两阶段提交,前面我们说了两阶段提交发生在数据变更期间,为了更好的理解两阶段提交,我们用一条更新命令来加以说明,更新语句如下:
mysqlupdateTsetc=c+1whereid=2;
假设未更新前id=2的这行数据c的值为0,这条更新语句在MySQL数据库内部是如何执行的呢?在下面这张执行流程图:
从流程图中可以看出,在InnoDB存储引擎下,一条update语句在MySQL内部执行大概会经历下面五个步骤:
1、执行器先找引擎取id=2这一行数据,如果ID=2这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。2、执行器拿到引擎给的行数据,把这个值加上1,比如原来是N,现在就是N+1,得到新的一行数据,再调用引擎接口写入这行新数据。3、引擎将这行新数据更新到内存中,同时将这个更新操作记录到redolog里面,此时redolog处于prepare状态。然后告知执行器执行完成了,随时可以提交事务。4、执行器生成这个操作的binlog,并把binlog写入磁盘。5、执行器调用引擎的提交事务接口,引擎把刚刚写入的redolog改成提交(