zoukankan      html  css  js  c++  java
  • MySQL 中实现可重复读(RR)的原理--MVCC

    MVCC,多版本并发控制(Multi-Version Conncurrency Control)是mysql中基于乐观锁原理实现的隔离级别的方式。用于实现读已提交和可重复读取隔离级别。
    对于MVCC,是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间(事务ID),一个保存行的删除时间(回滚指针),当然存储的并不是实际的时间值,而是系统版本号(system version number).每开始一个新的事务,系统版本号都会自动递增,事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。

    MVCC的核心就是 Undo log+ Read-view,“MV”就是通过 Undo log来保存数据的历史版本,实现多版本的管理,“CC”是通过 Read-view来实现管理,通过 Read-view原则来决定数据是否显示。同时针对不同的隔离级别, Read view的生成策略不同,也就实现了不同的隔离级别。

    简单说一句话就是:undo log + 版本链 + 比较规则

    举例:
    如下图,事务 T-100 和 T-120 对表中 id = 1 的数据行做 update 操作,事务 T-130 进行 select 操作。

    从图中可以看出,即使 T-100 已经提交修改,三次 select 语句的结果都是“lisi”。
    整个过程的流程如下图:

    下面详细讲讲流程:

    当一个事务第一次执行查询sql时,会生成一致性视图 read-view(快照),它由执行查询时所有未提交事务 id 数组(数组中最小的 id 为 min_id)和已创建的最大事务 id(max_id)组成,查询时从 undo log 中最新的一条记录开始跟 read-view 做对比,如果不符合比较规则,就根据回滚指针回滚到上一条记录继续比较,直到得到符合比较条件的查询结果。对于上面的例子,事务T-130 在第一次执行select 语句时,生成了 read-view 快照,此时未提交的事务id是100,已提交的事务id是120,所以 read-view :[100],120

    undo log 中记录和 read-view 的比对规则:

    1. 如果当前记录的事务id落在绿色部分(trx_id < min_id),表示这个版本是已提交的事务生成的,可读。
    2. 如果当前记录的事务id落在红色部分(trx_id > max_id),表示这个版本是由将来启动的事务生成的,不可读。
    3. 如果当前记录的事务id落在黄色部分(min_id <= trx_id <= max_id),则分为两种情况:
      • 若当前记录的事务id在未提交事务的数组中,则此条记录不可读;
      • 若当前记录的事务id不在未提交事务的数组中,则此条记录可读。

    扩展
    1)对于删除的情况
    可以认为是update 的特殊情况,会将版本链上最新的数据复制一份,然后将 trx_id 修改成删除操作的 trx_id ,同时在该条记录的头信息(record header)里的(deleted_flag)标记位上写位 true,来表示当前记录已经被删除,在查询时按照上面的规则查到对应的记录,如果deleted_flag 标记为是true,则说明该条记录已被删除,不返回数据。

    2)隔离级别 Read Committed 和 Read Repeatable
    RC 和 RR 隔离级别都是由 MVCC 实现,区别在于:
    RC 隔离级别时,read-view 是每次执行 select 语句时都生成一个;
    RR 隔离级别时,read-view 是在第一次执行 select 语句时生成一个,同一事务中后面的所有 select 语句都复用这个 read-view 。

  • 相关阅读:
    ASP.NET在禁用视图状态的情况下仍然使用ViewState对象【转】
    Atcoder Regular Contest 061 D Card Game for Three(组合数学)
    Solution 「CERC 2016」「洛谷 P3684」机棚障碍
    Solution 「CF 599E」Sandy and Nuts
    Solution 「洛谷 P6021」洪水
    Solution 「ARC 058C」「AT 1975」Iroha and Haiku
    Solution 「POI 2011」「洛谷 P3527」METMeteors
    Solution 「CF 1023F」Mobile Phone Network
    Solution 「SP 6779」GSS7
    Solution 「LOCAL」大括号树
  • 原文地址:https://www.cnblogs.com/chaozhengtx/p/14496171.html
Copyright © 2011-2022 走看看