6、InnoDB的Mvcc机制和bufferPool

Mvcc机制

Multi-Version Concurrency Control)多版本并发控制,用于实现innodb查询读已提交和可重复读两个级别的隔离性,实现机制就是通过read-viewundo日志版本链比对,使得不同的事务读取同一条数据在版本链上的不同版本数据。

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,寻找下一条数据

2、如果undo日志的min_id<trx_id< max_id,则可能存在两种情况:
        如果trx_id在未提交事务数组中,则不可见,继续寻找 下一条数据
        如果trx_id不在未提交数组中,事务开始前就已经提交了,可见
3、如果undo日志的trx_id<min_id,说明 事务开始前就已经提交了,可见

 

BufferPool缓存机制

mysql在增删改操作后,考虑随机写的性能问题,并不会马上把数据写入磁盘,而是将数据存入bufferpool中,等堆积到一定数量后再写入磁盘,所以事务提交和写入磁盘是异步。为了保证数据的持久性,mysql使用了bufferPool机制

 

1、将需要修改的数据加载到bufferpool

2、写入undolog,属于顺序写非常快

3、将更新数据写入bufferpoll,操作内存非常快

4、写入redolog。如果数据库宕机可以从redolog中将没有写入磁盘的数据重做,顺序写非常快

5、写入binlog日志,用于后续主从同步,顺序写非常快

6、将commit标记写入redolog,在完成前这一步后,commit就算提交完成; ,顺序写非常快

7、后续异步的会将bufferpool中的数据以页为单位写入磁盘,随机写较慢

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值