zoukankan      html  css  js  c++  java
  • MySQL多版本并发控制(MVCC)

    MVCC是行级锁的一个变种,但是它在很多的情况下避免了加锁操作,因此开销更低。MySQL,包括Oracle、PostgreSQL都实现了MVCC,虽然每个关系数据库实现不一样,但大都是实现了非阻塞的读操作,写操作也只锁定必要的行。

    MVCC的实现原理:InnoDB的MVCC的实现原理,是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间或删除时间。MVCC实现类型都是有乐观并发控制和悲观并发控制。

    MVCC下的SELECT、INSERT、DELETE、UPDATE是如何进行操作的:

     

    SELECT:需要满足两个条件

    1、只查询行版本号小于当前事务的版本号的行 

    2、查询删除版本大于当前事务的版本号的行、要么未定义的删除版本号的行

    条件一确保了读取的行在读取之前就已经存在了而不是在读取更新之后的行

    条件二确保了在查询之前未被删除

    条件一和条件二满足了MySQL隔离级别中的可重复读

     

    INSERT:

    新插入的每一行保存当前系统版本号作为行版本号

     

    DELETE:

    每删除一行保存当前系统版本好作为删除版本号

     

    UPDATE:

    插入一行新记录,保存当前系统版本号作为行版本号, 同时保存当前系统版本号到原来那一行数据的行删除版本号。(可以看做执行了一次INSERT和一次DELETE操作)

     

     

      MVCC只在REPEATABLE READ和READ COMMITTED两个隔离级别下工作。

      其他两个隔离级别都和MVCC不兼容,因为READ UNCOMMITTED总是读取最新的数据行,而不是符合当前事务版本的数据行。而SERIALIZABLE则会对所有读取的行都加锁。

     

     

     

     
  • 相关阅读:
    用Groovy处理JMeter变量
    用Groovy处理JMeter断言和日志
    选择手动测试还是自动化测试?
    从单元测试标准中学习
    利用ThreadLocal解决线程同步问题
    JSON基础
    Java中interface属性和实例方法
    集成测试、单元测试、系统测试
    异步查询转同步加redis业务实现的BUG分享
    《深入理解java虚拟机》读书笔记三——第四章
  • 原文地址:https://www.cnblogs.com/shenyunwen/p/9374735.html
Copyright © 2011-2022 走看看