InnoDB的多版本并发控制(MVCC)

原创 2018年04月15日 19:10:11

前言

这篇文章介绍MySQL里面InnoDB引擎事务的多版本并发控制机制(MVCC),可以用来实现两种事务的隔离级别:read committed和repeatable read(关于事务隔离级别的介绍,可以参考这篇文章:https://blog.csdn.net/qq_33290787/article/details/51924963)。同时MVCC解决了repeatable read中可能出现的幻读的问题。


实现

MVCC的核心就是给每行数据增加了两个隐藏的列,一个是修改这行的最后的系统版本号(system version number),一个是删除该行的系统版本号。每开始一个新事物,系统版本号就会递增。事务开始的时候,系统版本号会作为当前事务的版本号,用来查询和操作。

SELECT:

    a. InnoDB只会读取版本号小于等于该事务版本号的所有数据行,这样保证了事务进行时,所有的行要么是事务进行前已经存在,要么是事务自身插入或者修改的(这样实现了事务重复读取数据一致,同时不会出现幻读的现象)

    b. 同时读取的行的删除版本号要么是未设置的,要么大于当前事务版本号,这样保证该行在事务开始前没有被删除。


INSERT:

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

DELETE:

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

UPDATE:

    InnoDB将更新数据插入新一行,将事务版本号作为新一行的行版本号,同时将老一行的删除版本号置为当前事务版本号。


优缺点

优点:1. 在事务中,大多数的读操作不需要加锁     2. 解决了repeatable read中幻读的问题

缺点:1. 每行记录都需要额外的存储空间 2. 需要更多的行检查和维护工作


一点感想

数据版本号在我们日常工作中很多地方都可以发挥作用:例如实现幂等、简单的乐观锁机制等等。希望之后能够多学习多实践,有朝一日能够比较完善地总结一下数据版本号的各种用途。



iOS开发—版本控制-GIT | SVN

-
  • 1970年01月01日 08:00

innodb并发控制mvcc(多版本并发控制)

innodb有四种事务隔离机制,read uncommitted、read committed、repeatted read、 serializable,隔离界别依次提高,而且基本靠锁实现这些隔离级别...
  • qq_22912803
  • qq_22912803
  • 2016-09-02 14:07:30
  • 221

多版本并发控制(MVCC)在实际项目中的应用

最近项目中遇到了一个分布式系统的并发控制问题。该问题可以抽象为:某分布式系统由一个数据中心D和若干业务处理中心L1,L2 … Ln组成;D本质上是一个key-value存储,它对外提供基于HTTP协议...
  • abv123456789
  • abv123456789
  • 2016-03-11 16:52:30
  • 2921

关于Mysql事务REPEATABLE_READ隔离级别下多版本并发控制(MVCC)重复读产生的坑的你踩过么?

前几天在系统中开发一个活动, 使用了行级锁,但是却在并发测试下出现了重大的Bug,话不多说, 直接开始. 事务的隔离级别是Mysql默认的REPEATABLE_READ. Time1: 事务A...
  • Mr_rain
  • Mr_rain
  • 2016-07-08 11:31:48
  • 2108

【Mysql进阶】数据库之多版本并发控制(MVCC)

目录 【Mysql进阶】数据库之多版本并发控制(MVCC) 什么是并发控制 并发控制的种类 MVCC介绍 Mysql的MVCC实现机制 实现概要 实现细节 总结 【Mysq...
  • fgfgbh0422
  • fgfgbh0422
  • 2018-04-05 15:26:02
  • 39

MySQL的并发控制与加锁分析(MVCC/LBCC)

原文:https://www.cnblogs.com/yelbosh/p/5813865.html本文主要是针对MySQL/InnoDB的并发控制和加锁技术做一个比较深入的剖析,并且对其中涉及到的重要...
  • m0_37730732
  • m0_37730732
  • 2018-02-14 14:52:20
  • 33

SQL优化(六) MVCC PostgreSQL实现事务和多版本并发控制的精华

数据库事务隔离性可通过锁机制或者MVCC实现,PostgreSQL默认使用MVCC。本文结合实例介绍了PostgreSQL的MVCC实现机制,并介绍了PostgreSQL如何通过MVCC保证事务的原子...
  • Habren
  • Habren
  • 2016-06-06 07:13:45
  • 944

mysql四种事务隔离级别以及mvcc并发访问控制

Mysql是一个高性能支持并发访问的开源数据库,支持多种事务隔离级别以解决脏读,幻读等现象。分别介绍如下: 1.未提交读:          在该级别下,即使事务中的修改没有被提交,其他事务仍然可以访...
  • SummerMangoZz
  • SummerMangoZz
  • 2017-10-07 22:59:15
  • 191

多版本并发控制(MVCC)在分布式系统中的应用

本文转自http://coolshell.cn/articles/6790.html 问题 最近项目中遇到了一个分布式系统的并发控制问题。该问题可以抽象为:某分布式系统由一个数据中...
  • wh62592855
  • wh62592855
  • 2012-03-13 11:37:53
  • 751

MySQL的多版本并发控制

什么是MVCCMySQL的默认隔离级别REPEATABLE READ(可重复读)解决了脏读,不可重复读问题,但还是无法解决幻读的问题。所谓幻读,指的是A事务读取某个范围内的记录时,另外一个B事务又在该...
  • XxieYyuHhui
  • XxieYyuHhui
  • 2017-11-13 16:48:14
  • 94
收藏助手
不良信息举报
您举报文章:InnoDB的多版本并发控制(MVCC)
举报原因:
原因补充:

(最多只允许输入30个字)