连接器,解析器,优化器,执行器,这里就不细说了。
1.检查要更新的数据页是否在 Buffer pool 中,如果不存在从磁盘上读取数据页,放到 Buffer Pool 中;
如果存在,则直接修改对应的数据页。
2.在修改数据之前,要先生成对应的 redo log,把 redo log 写入 redo log buffer 中。
3.当用户commit的时候,需要把redo log buffer 中的数据写入到磁盘 redo log 文件中。
而Buffer Pool中的脏页,并不是立刻刷回磁盘的,有很多的刷盘策略。
4.如果redo log 写入成功,代表commit成功。
5.如果redo log 写入失败,需要rollback回滚操作。
话术:
首先由server层的连接器建立连接,通过解析器解析sql语句,通过优化器进行sql优化,在使用执行器把sql语句交给引擎层去执行,在InnoDB引擎中,会开启事务,然后加插入意向锁【这里感觉有问题】锁定主键保证并发插入,接着记录undo log的redo log缓冲区,然后记录undo log缓冲区,再去记录redo log缓冲区,(这里undo log是保证事务回滚的关键,redo log是保证数据不丢失的关键),更新数据内存页缓冲区,然后进行提交事务,此时redo log会进行落盘,redo log落盘成功则事务提交成功,否则事务回滚,释放插入意向锁,执行结束。这里有个关键点就是所有日志和数据在事务提交前都保存在了缓冲区中,只有事务提交并且redo log落盘成功时,才算真正的执行成功。