以update test set idx = 2 where id=10;为例
1.
server层,语法解析,解析成mysql认识的语法,查询什么表,什么字段,生成查询路径树,选择最优查询路径
2.
InnoDB存储引擎,判断id=10这行对应的页是否在缓存池里,如果不在,则将对应的页从datafile中读到InnoDB缓冲池中,并对相关记录加独占锁
3.
undo tablespace回滚段
,idx修改之前的值和对应的主键、事务id原来的信息写入undo tablespace回滚段
4.
更新缓存页中数据,并将更新记录和生成的LSN值(日志子序列号)
写入log buffer。更新之后缓冲池里的页就是脏页了。
5. 提交事务时,根据innodb_flush_log_at_trx_commit设置,用不同方式将log buffer中的更新记录刷新到redo log中
然后写binlog ,写完之后后开始binlog的commit,同步到磁盘
binlog同步后把binlog文件和postition(binlog文件内的位置)写到redo log 中,然后在redo log写入一个commit标志,然后就完成了这个事务的提交。接下来释放独占锁
6.后台i/o线程将缓存中合适的脏页刷新到磁盘数据文件中,如果开启双写缓存功能,需要先拷贝一份脏页到双写缓冲区,等其中的数据落盘,再从缓冲池把脏页刷新到各个数据文件中。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69990629/viewspace-2744277/
,如需转载,请注明出处,否则将追究法律责任。