MySQL的多版本并发控制MVCC

         MVCC,Multi-Version Concurrency Control 多版本并发控制,MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问;在编程语言中实现事务内存。

         这次我讲的主要是MySQL的MVCC的实现,基于MySQL的事务存储引擎。MySQL大多数事务型存储引擎的实现的都不是简单的行级锁。基于提升并发性能的考虑,他们一般都实现了多版本并发控制(MVCC)。当然Oracle,PostgreSQL等其他数据库也都实现了MVCC,只是实现机制不同。

         MVCC的实现,是同步保存数据在某个时间点的快照来实现的。也就是说,不管需要执行多长时间,每个事务看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。

         这里主要说下InooDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现。这两个列,一个保存了行的创建时间,一个保存行的过期时间(或删除时间)。当然存储的并不是实际的时间值。而是系统版本号。没开始一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。下面看一下在REPEATABLE READ (可重复读)隔离级别下(如果不清楚隔离级别的小伙伴可以搜索一下MySQL的隔离级别),MVCC具体是如何操作的。

  1. SELECT
    1. 对于select语句,只有同时满足了下面两个条件的行,才能被返回:
      • 行的被修改版本号小于或者等于该事务号

      • 行的被删除版本号要么没有被定义,要么大于事务的版本号:行的删除版本号如果没有被定义,说明该行没有被删除过;如果删除版本号大于当前事务的事务号,说明该行是被该事务后面启动的事务删除的,由于是repeatable read隔离等级,后开始的事务对数据的影响不应该被先开始的事务看见,所以该行应该被返回.

  2. INSERT

    1. 对新插入的行,行的更新版本被修改为该事务的事务号

  3. DELETE

    1. 对于删除,innodb直接把该行的被删除版本号设置为当前的事务号,相当于标记为删除,而不是实际删除

  4. UPDATE

    1. 在更新行的时候,innodb会把原来的行复制一份到回滚段中,并把当前的事务号作为该行的更新版本

  5. MVCC优缺点

    1. 上述策略的结果就是,在读取数据的时候,innodb几乎不用获得任何锁, 每个查询都通过版本检查,只获得自己需要的数据版本,从而大大提高了系统的并发度。

    2. 这种策略的缺点是,为了实现多版本,innodb必须对每行增加相应的字段来存储版本信息,同时需要维护每一行的版本信息,而且在检索行的时候,需要进行版本的比较,因而降低了查询的效率;innodb还必须定期清理不再需要的行版本,及时回收空间,这也增加了一些开销

  6. 总结

        MVCC只在REPEATABLE READ(可重复度)READ COMMITTED(提交读)两个隔离级别下工作。其他两个隔离级别都和MVCC不兼容。READ UNCOMMITTED(未提交读)总是读取最新的数据行,不符合当前事务版本的数据行。SERIALIZABLE(可串行化)则会对所有读取的行都加锁

参考资料:《高性能MySQL》

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值