• MySQL


    浅谈MVCC(Multi-Version Concurrency Control)

    1.MySQL大多数事务型存储引擎实现的都不是简单的行锁。基于提升并发性能的考虑,他们一般都同时实现了多版本并发控制(MVCC)。

    2.可以认为MVCC是行级锁的一个变种,它能在大多数情况下避免加锁操作,因此开销更低。无论怎样实现,它们大都实现了非阻塞的读操作,写操作也只锁定制定的行。

    3.MVCC是通过保存数据在某一个时间点的快照来实现的,也就是说无论事务执行多久,每个事务看到的数据都是一致的。InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现,这两个列一个保存了行的创建时间,一个保存了行的过期时间(或删除时间),当然,并非存储的是时间,而是系统版本号。每开启一个事务,版本号都会递增,事务开始时刻的系统版本号会作为事务的版本号。

    idname创建时间(行版本号)删除时间(删除版本号)
    1 Mary 1 null
    2 Jann 1 null

    以InnoDB存储引擎的的REPEATABLE READ隔离级别来说:

    SELECT

    ​ ①只查询创建时间版本号小于当前事务版本号的数据行(保证事务读取的行要么在事务开始之前就存在,要么是事务本身插入的行)

    ​ ②行的删除版本号要么未定义,要么大于当前事务版本号,这样可以确保事务读取到的行,在开始事务之前未被删除

    只有复合上诉两个条件的记录才会作为结果返回

    INSERT

    ​ 为插入的数据保存当前系统版本号作为行版本号

    DELETE

    ​ 保存当前系统版本号作为删除行版本号

    UPDATE

    ​ 插入一行数据,并将当前系统版本号赋予行版本号;同时保存当前系统版本号到原来的行作为删除版本号。

    注:MVCC只在REPEATABLE和READ COMMITTED两个隔离级别下才能正常工作。

  • 相关阅读:
    ThinkPHP5如何引用新建的配置文件?
    MySQL与SQLServer的update left join语法区别
    如何POST一个JSON格式的数据给java接口,获得返回数据
    如何使用ThinkPHP5 ,自动生成目录?
    LeetCode347_TopK
    数据结构算法Review1_堆
    OJ_3_字符串数字相互转换
    C++Review11_指针数组和数组指针
    LeetCode15_三数之和
    LeetCode1_两数之和
  • 原文地址:https://www.cnblogs.com/frankcui/p/12008595.html
Copyright © 2020-2023  润新知