mysql基础知识点五-MVCC

mysql基础知识点五-MVCC

1643254819701

mvvc(Multi-Version Concurrency Control)

​ 一句话形容:MVCC机制的实现就是通过read-view机制与undo版本链比对机制,使得不同的事务会根据数据版本链对比规则读取

基本概念:

Mysql在可重复读隔离级别下如何保证事务较高的隔离性,我们上节课给大家演示过,同样的sql查询语句在一个事务 里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果。 这个隔离性就是靠MVCC(Multi-Version Concurrency Control)机制来保证的,对一行数据的读和写两个操作默认 是不会通过加锁互斥来保证隔离性,避免了频繁加锁互斥,而在串行化隔离级别为了保证较高的隔离性是通过将所有操 作加锁互斥来实现的。 Mysql在读已提交和可重复读隔离级别下都实现了MVCC机制

下面看一下undo日志版本链与read view机制详解 (这个最重要)

  1. 首先undo日志版本链是一行数据被多次修改后会保留回滚的undolog,并且用俩个隐藏字段trx_id,roll_pointer把这些undolog串联成一个版本链。

  2. read view别名,一致性视图,在事务结束之前不会变化,(读提交隔离级别下一致性视图每次提交都会重新生成),这个视图对应id要和数组中最小id和最大id进行比较,从而得到最终快照

  3. 版本链比对规则

    注意看图片右下角,那是个比对规则
        
    1. trx_id<min_id,表示为已提交
    2. trx_id>max_id, 表示不可见,
    3. min_id<=trx_id<=max_id时,trx_id在视图组中则表示由未提交事务产生不可见,反之可见。
        
     对于删除可以认为是特殊的update,查看该条记录的头信息(record header)里的(deleted_flag)为true,代表删除
    
  4. 关于begin/start transaction的注意事项

    当他们遇到第一个修改语句时,事务才真正启动,向mysql申请事务id。

Innodb引擎SQL执行的BufferPool缓存机制

1644310748020

看上面这个错综复杂的流程,为啥不直接更新磁盘上数据呢?

  1. 首先性能差,一个请求过来就对磁盘文件随机读写,然后在更新数据
  2. 其次磁盘读写能力很差,然后直接更新磁盘文件导致数据库并发能力会很差
  3. mysql这套复杂的机制可以保证更新的是内存bufferPool,然后在顺序写日志,同时海能保证数据一致性。
  4. 这套机制能保证mysql抗住每秒几千的读写
posted @ 2022-02-09 09:59  小傻孩丶儿  阅读(162)  评论(0编辑  收藏  举报