• MySQL--MVCC


    MVCC 实现原理

    总结:

    • 并发事务在操作资源的时候,存在着三种操作,分别为: 读读操作读写操作写写操作,这三种操作可能带来脏读不可重复读幻读的问题。使用锁能够解决这些问题,但是,加锁每次只能有一个事务操作资源,会导致数据库性能不佳。因此就有了MVCC。

    • MVCC指的是多版本并发控制

    • 使用目的: 通过记录多个修改的历史版本替代锁,实现事务间的隔离效果,保证非阻塞读。

    • MVCC的两种读方式:

      • 当前读: 总是读取到最新版本的数据;
      • 快照读: 读取的是历史版本记录。
    • MVCC的实现核心

      • 表的隐藏列: 记录事务id以及上一个版本数据的地址;

      • undo log: 记录数据各版本修改历史,也即为事务链;

      • Read View: 读视图,用于判断那些版本是可见的。

        • trx_list: 未提交的事务ID数组;
        • up_limit_id : 数组中事务最小的id;
        • low_limit_id: ReadView生成时刻系统尚未分配的下一个事务ID,也就是目前已出现过的事务ID的最大值+1。
      • 当前事务是如何判断那些版本是可见的呢?有以下规则:

        • 不在未提交的事务数组中,并且事务ID< Max或者是自己,对于当前的事务都可见。

    image

    • 如果新提交了事务,并且当前事务的隔离级别是RC(读已提交),则会重新拿ReadView,读取最新的版本数据。
    • 如果新提交了事务,并且当前事务的隔离级别为RR(可重复读) ,则不会重新拿ReadView,读取的还是最开始的历史版本数据。

    因此在上面的例子中,如果数据库的事务隔离级别为RC 则结果为 100 108 可见,108 是新提交的事务,ReadView会重新加载

    而如果数据库事务隔离级别为RR,则只有100 可见,ReadView还是最开始的历史版本数据。

    参考内容:码农架构: https://www.bilibili.com/video/BV1tV411y7sU

  • 相关阅读:
    单表查询和多表连接查询哪个效率更快
    高并发和秒杀系统设计
    微服务框架学习三:服务通信框架介绍
    微服务框架学习一:架构介绍
    微服务框架学习二:Http调用
    支付相关的学习资源
    service mesh学习规划
    智齿客服网页端接入文档V2.3
    VUE请求本地数据的配置json-server
    webpack学习
  • 原文地址:https://www.cnblogs.com/sinlearn/p/14969799.html
Copyright © 2020-2023  润新知