• mysql的MVCC


    《高性能 MySQL》描述:
    1. 通过两个隐藏列,一个保存行的创建时间,一个保存行的过期时间
    RR隔离级别:检索创建时间在当前事务版本号之前的数据,同时会检查数据的删除时间,保证新的删除操作不可见。
    select * from table where create_version <= ${version} and (delete_version is null or delete_version > ${version});

    INNODB实现:

    innodb的隐藏列不是创建时间和过期时间,而是当前事务的id列【在事务启动的时候向innodb申请的,是单调递增的】和删除标志位

    undo log:undo log记录的是事务的反向逻辑操作

                                      图片来源于极客时间 - MySQL实战45讲

    可重复读:

    按照可重复读的定义,一个事务启动的时候,能够看到所有已经提交的事务结果。但是之后,这个事务执行期间,其他事务的更新对他不可见。

    Innodb为每个事务构造了1个数组,用来保存这个事务启动瞬间,当前所有已经启动了但是还没有提交的事务id。

    数组中事务ID的最小值记为低水位,ID的最大值加1记为高水位。这个数组和高低水位就组成了事务的一致性视图。而数据版本的可见性规则,就是基于数据的 row trx_id 和这个一致性视图的对比结果得到的。

     

                                          图片来源于极客时间 - MySQL实战45讲

    如果数据的row trx_id 小于低水位,则表明这个版本是已经提交的事务或者当前事务自己生成的,这个数据是可见的。

    如果row trx_id大于高水位,则表明这个版本是后来启动的事务生成的,是不可见的。

    如果row trx_id大于低水位,小于高水位:

      如果 row trx_id在数组中,则表明是没有提交的事务生成的,是不可见的。

      如果 row trx_id不在数组中,则表明是已经提交的事务生成的,是可见的。

    读已提交:读已提交的计算逻辑与可重复读类似,不过读已提交的事务数组是在每一个语句执行前重新构造。

  • 相关阅读:
    MVC,MVP和MVVM的区别
    将数组里某个属性相同的对象合并成一个数组
    Ajax的理解
    VUE如何关闭Eslint的方法
    数组去重
    vue-router传递参数的几种方式
    密码的显示和隐藏
    "校园易借查询"选题报告
    我的第一个微信好友分析
    数据库实践
  • 原文地址:https://www.cnblogs.com/juanmaofeifei/p/13348187.html
Copyright © 2020-2023  润新知