谈谈MySQL中数据编辑过程中涉及的两阶段提交阶段提交发生在数据更改(更新、删除、添加等)时,两阶段提交过程涉及到MySQL数据库中的两个日志系统:redologs和二进制日志文件。redolog之前介绍过,这里不再介绍。先简单说一下binlog文件。Binlog是MySQL服务器层提供的二进制文件。所以所有的存储引擎都可以使用binlog功能。Binlog是追加写入的逻辑日志,记录了执行语句的原始逻辑。文件写入到指定大小后,会切换到下一个文件继续写入,不会覆盖之前写入的日志文件。Binlog日志文件主要用于集群环境中服务器间的数据恢复和数据同步。在工作中,我们不小心删除了数据或表。如果我们需要恢复,我们使用binlog日志来恢复,所以binlog日志是MySQL数据库中的一个重要模块。了解了这两个日志后,我们再将目光放回到MySQL数据库的两阶段提交上。我们前面说过,两阶段提交发生在数据更改期间。为了更好的理解两阶段提交,我们用一个update命令来说明。更新语句如下:mysql>updateTsetc=c+1whereid=2;假设更新前id=2的数据行c的值为0,那么这条更新语句在MySQL数据库内部是如何执行的呢?在下面的执行流程中图:update语句执行流程从流程图可以看出,在InnoDB存储引擎下,一条update语句在MySQL内部执行时会经历以下五个步骤:1.执行者首先找到引擎fetchtherowofdatawithid=2,如果id=2行所在的数据页已经在内存中,则直接返回给executor;否则需要先从磁盘读入内存,再返回。2、执行器获取引擎给的行数据,将这个值加1,比如原来是N,现在是N+1,获取新的一行数据,然后调用引擎接口写入新的数据行。3.引擎将一行新数据更新到内存中,并在redolog中记录更新操作。此时redolog处于prepare状态。然后通知执行者执行完成,可以随时提交交易。4、executor生成本次操作的binlog,并将binlog写入磁盘。5、执行者调用引擎的commit事务接口,引擎将新写入的redolog变为commit状态,更新完成。在这五个步骤中,请注意红色标记的部分。redolog分为prepare和commit两个阶段。此过程称为两阶段提交。重做日志不拆分成两步提交可以吗?我们可以用逆推法来证明。假设不使用两阶段提交,有两种情况。一种是先提交redolog再提交binlog日志,还有一种是先提交binlog日志再提交redolog。一起来看看这两种提交方式有什么问题?先写redolog再写binlog。假设当redolog写完,binlog还没有写完,MySQL进程异常重启。在这个过程中,更新出现了异常。当数据库发生异常时,重做日志可以保证数据的持久化。启动后恢复redolog数据后,c的值为1,但是binlog还没有写入,所以在binlog日志文件中没有记录这条update语句,如果使用这个binlog日志文件来恢复临时的library,恢复的id=2的那一行数据中c的值为0,与原library的值不一致。先写binlog,再写redolog。如果binlog写完了,redolog还没有写入,系统崩溃,系统重启后,id=2那行数据中c的值还是0,但是binlog日志中记录了这次更新文件。如果需要使用binlog日志文件来恢复临时库的话,那么id=2这一行数据c的值为1,与原库的值不一致。从这两个假设我们可以看出,无论先提交哪个日志文件,都可能存在数据不一致的情况。两阶段日志文件提交技术,解决了redo日志和binlog日志文件数据不一致的问题,从而保证了数据恢复时的数据一致性。以上就是MySQL数据编辑涉及的两阶段提交。希望本文对您的学习或工作有所帮助。如果觉得文章有帮助,请帮忙转发,谢谢。
