Mvcc机制
(Multi-Version Concurrency Control)多版本并发控制,用于实现innodb查询读已提交和可重复读两个级别的隔离性,实现机制就是通过read-view与undo日志版本链比对,使得不同的事务读取同一条数据在版本链上的不同版本数据。
read-view:
在开启事务后,会根据当前mysql生成 一致性视图read-view,将所有事务分为三块内容:
未提交trx数组=【100,150,200】,已创建最大trx_id=300
min_id:所有未提交事务id数组最小的id,max_id:已创建的最大事务id
该视图在事务结束之前都不会变化(如果是读已提交隔离级别在每次执行查询sql时都会重新生成),事务里的任何sql查询结果需要从对应版本链里的最新数据开始逐条跟read-view做比对从而得到最终的快照结果
UNDO日志:
回滚日志,在更改数据时,会记录一个历史版本,通过rollPointer指针将多个版本串起来,如果修改异常需要进行回滚,就会回滚到上一个版本
需要从undo日志的中循环对比,获得可见的数据:
1、如果undo日志的trx_id>max_id,则肯定是后面新创建的事务操作影响造成的版本,属于不可见,继续根据roll_pointer,寻找下一条数据
BufferPool缓存机制
mysql在增删改操作后,考虑随机写的性能问题,并不会马上把数据写入磁盘,而是将数据存入bufferpool中,等堆积到一定数量后再写入磁盘,所以事务提交和写入磁盘是异步。为了保证数据的持久性,mysql使用了bufferPool机制
1、将需要修改的数据加载到bufferpool
2、写入undolog,属于顺序写非常快
3、将更新数据写入bufferpoll,操作内存非常快
4、写入redolog。如果数据库宕机可以从redolog中将没有写入磁盘的数据重做,顺序写非常快
5、写入binlog日志,用于后续主从同步,顺序写非常快
6、将commit标记写入redolog,在完成前这一步后,commit就算提交完成; ,顺序写非常快
7、后续异步的会将bufferpool中的数据以页为单位写入磁盘,随机写较慢