参考资料
MySQL查询和更新语句的执行过程
3.mysql更新语句执行过程详解
mysql XID和trx_id小结
执行过程
更新过程的关键节
- 执行器调用引擎层的接口获得 id = 2 的数据
- 引擎层的内存如果存在id = 2 这一行的页,那么直接返回给执行器
- 如果不存在那么从磁盘中加载该页并放在内存中,然后再返回给server 层
- 执行器获得数据后,对字段C设置为20 ,并再次调用引擎层接口,
- 引擎层先将本次要修改数据的原始数据写到undo log中,以防回滚
- 然后将本次修改记录在 redo log 中并存于buffer中
- 事务进入提交阶段(这里用到了两阶段提交),
- 1 首先将redo buffer里面的日志写到磁盘,并标记为prepare状态
- 2 第二阶段的提交,
- 执行器生成这个操作的binlog,并将binlog也写到磁盘,这个时候xid也写入到了binlog,binglog落盘后
- 执行器再调用引擎层的提交事务接口,将redo log标记为commit 状态,注意的是这个时候redo log数据不用落盘
为什么需要两阶段提交
- 若先写redo log后写binlog,redo log写完后,主库crash,从库就没有这次更新,和主库的值不一致了
- 若先写binlog后写redo log,binlog写完后,主库crash,从库就有这次更新,而主库没有这次更新