美文网首页
MySQL多版本并发控制(MVCC)

MySQL多版本并发控制(MVCC)

作者: 十年磨一剑1111 | 来源:发表于2020-01-10 17:06 被阅读0次

    什么是多版本并发控制?

    多版本的含义:多版本讲的就是MySQL服务器会保存数据在多个时间点的快照(可以理解为多个不同的版本)

    并发控制:不同的存储引擎的MVCC实现方式是不同的,典型的有乐观并发控制和悲观并发控制。

    InnoDB的MVCC是怎么实现的?

    InnoDB的MVCC是通过在每行后面保存两个隐藏的列来实现的,一个保存了行的创建时间,一个保存了行的过期时间,不过存储的并不是时间的时间值而是系统的版本号。每开始一个事务系统版本号就会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。

    好了,说了这么多还不如来点实际的,接下来具体看看Innodb MVCC是如何操作的

    SELECT
    (1) Innodb 只会查找版本早于当前事务版本的数据行,这样就可以保证事务读取到的行,要么是在事务开始前已经存在,要么是事务自身插入或者修改过的。
    (2) 行的删除版本要么未定义,要么大于当前事务版本号。这样就可以保证事务读取到的行,在事务开始之前未被删除。
    只有符合这两个条件的记录,才能返回作为查询结果。

    INSERT
    Innodb 会为新的记录保存当前版本号作为行的版本号。

    DELETE
    Innodb为删除的每一行保存当前系统版本号作为删除标识。

    UPDATE
    Innodb update操作会插入一个新行,Innodb会为新的记录保存当前系统的版本号作为行版本号,同时保存当前系统的版本号到原来的行作为行删除标识。

    MVCC适用场景

    MVCC只在repeatable read(可重复读) 和 read committed (提交读也叫不可重复读)两个隔离级别下工作,其他两个隔离级别都和MVCC不兼容,因为read uncommitted (未提交读) 总是读取最新的数据行,而不是符合当前事务版本的数据行。而serializable(串行化)则会对所有读取行都加锁。所以在网上也能看到说MVCC是MySQL用来实现可重复读的。

    优缺点

    优点: 因为加了两个额外的列,使大多数操作都可以不用加锁,使得数据操作简单,性能很好。
    缺点:因为加了两个额外的列,因此需要额外的存储空间,另外,就是需要做更多的行检查工作,以及一些额外的维护工作。

    思考:
    1.Innodb这种实现方式是属于乐观锁,还是悲观锁?

    相关文章

      网友评论

          本文标题:MySQL多版本并发控制(MVCC)

          本文链接:https://www.haomeiwen.com/subject/hykmactx.html