一条更新sql是如何执行的

1、更新流程

场景:更新数据
实现:不会每次都直接写到磁盘上,而是写入到buffer pool里面,再由线程刷新到磁盘
原因:IO代价太大了

一条更新sql是如何执行的_第1张图片

1)缓冲池

Innodb里有内存的缓冲池buffer pool。

2)脏页

内存里buffer pool的数据页和磁盘数据不一致的时候,我们把它叫做脏页。

3)刷脏

Innodb有专门的把buffer pool的数据写入到磁盘的线程,每隔一段时间就一次性地把多个修改写入磁盘,这个就叫刷脏。

2、更新案例

一条更新sql是如何执行的_第2张图片

问题:为什么要用两阶段提交(XA)呢?
举例:
如果我们执行把name改成jin,如果写完redo log,还没有写bin log,MySQL重启了。
因为redo log可以恢复数据,所以写入磁盘的是jin。
但是bin log里面没有记录这个逻辑日志,所以这时候用bin log去恢复数据或者同步到从库,就会出现数据不一致的情况。
所以在写2个日志的情况下,bin log就充当了一个事务的协调者,通知innodb来执行prepare或commit或rollback。类似于分布式事务,不用2阶段提交,就不能保证都成功或者都失败。

你可能感兴趣的:(mysql,更新,redo,bin,log)