Mysql两阶段提交

在看Mysql相关内容的时候常常听到两阶段提交,那之前都是云里雾里的,经过学习丁奇老师的这篇文章完全明白了其流程和含义。node

提到两阶段提交,必须先说一下两个日志:redo logbinlogsql

重要的日志模块:redo log

数据在磁盘中是按照主键顺序存储的,在对数据进行更新操做(insert、update、delete)的时候,既要写数据又可能对其余数据进行移动,若是每次都写进磁盘是很耗性能的。redo log这里就用到的WAS技术,WAL的全称是Write-Ahead Logging,它的关键点是先写日志再写磁盘,而且 写日志是顺序写 速度很快。数据库

具体来讲,当有一条记录须要更新的时候,InnoDB 引擎就会先把记录写到redo log,并更新内存,这个时候更新就算是完成了。同时Innodb引擎会在适当的时候讲这个操做更新到磁盘里面。性能

Innodeb的redo log是固定大小的,好比能够配置为一组4个文件,每一个文件的大小是1GB,那么总共能够记录4GB的操做,从头开始写,写到末尾就又会到开始循环。固然当大小不够的时候会讲数据刷新到磁盘(数据文件内)。学习

有了redo log Innodb就能够保证即便数据库发生异常重启,以前提交的记录都不会丢失,这个能力称为crash-safe.spa

重要的日志模块:binlog

前面提到的redo log是Innodb提供的,而binlog是Server层提供的。这两个日志有以下不一样日志

  • redo logInnodb引擎特有的;binlogMysql Server层实现的,全部引擎均可以使用code

  • redo log是物理日志,记录的是"在某个数据页上作了什么操做";binlog是逻辑日志,记录的是这个语句的原始逻辑,好比"给ID=2这一行的C字段加1"接口

  • redo log是循环写的;binlog是追加的,不会覆盖之前的日志事务

  • binlog用于主从同步、恢复数据(误删除)和扩容等

两阶段提交

update test set age = age +1 where id = 1 当执行这条语句的时候,咱们看看它的内部流程

  • 执行器先去引擎找id=1的这一行,id是主键引擎直接用树搜索找到这一行。若是这一行的数据页在内存中,就直接返回给执行器,不然就须要从磁盘读取而后在返回。

  • 执行器拿到引擎提供的行数据,给age字段加1,好比原来是9,如今就是10,获得新的一行数据,在调用引擎接口写入这行数据

  • 引擎将新的数据行更新到内存中,同时将这个更新操做记录到redo log,此时redo log处于prepare状态,而后告知执行器执行完成了,随时能够提交事务

  • 执行器生成这个操做的binlog,并把binlog写入磁盘

  • 执行器调用引擎接口,引擎把刚刚写的redo log改为提交commit状态,更新完成。

最后三步比较绕,将redo log的写入拆成了两个步骤preparecommit,这就是两阶段提交

相关文章
相关标签/搜索