MySQL 多版本并发控制(MVCC)

原创 2018年02月12日 13:30:50

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

Oracle等其他数据库也实现了MVCC,但各个数据库MVCC的实现标准并不一致。

可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。它实现了非阻塞的读操作,写操作也只锁定必要的行。

MVCC 的实现,是 通过保存呢数据在某个时间点的快照来实现的。典型的有乐观(optimistic)并发控制和悲观(pessimistic)并发控制。

InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的。分别为:行的创建时间、行的过期时间(或删除时间)。当然存储的并不是实际的时间值,而是系统的版本号(system vesion number)。

一个新的事务开始,版本号回自动递增。开始时系统版本号会作为事务的版本号,用来和查询到的行记录的版本号进行比较。

在REPEATABLE READ隔离级别下,MVCC具体操作如下:

SELECT

InnoDB会根据一下两个条件价差每行记录:

    a.InnoDB只查找版本早于当前事务版本的数据行,确保事务读取的行,要么在事务开始前已经存在,要么是事务自身插入或者修改过的。

    b.行的杀出版本要么未定义,哟啊么大雨当前事务版本号,这可以确保事务读取到的行,在事务开始之前未被删除。

只有符合上述的两个条件的记录,才能返回作为查询结果。

INSERTInnerDB为新插入的每一行保存当前系统的版本号作为行版本号。
DELETEInnerDB为删除的每一行保存当前系统的版本号作为行删除标识。
UPDATEInnerDB为插入一行新纪录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识。

优点:保存这两个额外系统版本号,使大多数读操作不用加锁。这样设计使得读数据操作很简单,性能很好,并且也能保证只会读取到符合标准的行。

缺点:每行记录都需要额外的储存空间,需要做更多的行检查工作,以及一些额外的维护工作。

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

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

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

高性能MySQL -MySQL架构,MVCC多版本并发控制和一些基本概念

内容源于《高性能MySQL》一、MySQL逻辑架构架构图: 最上层不是Mysql独有的, 比如连接处理,授权认证, 安全 等等 第二层核心服务功能,包括查询解析,分析,优化,缓存以及所有内置函数...
  • Return_True_hang
  • Return_True_hang
  • 2017年03月04日 17:55
  • 874

innodb 多版本并发控制原理详解

多版本并发控制技术已经被广泛运用于各大数据库系统中,如Oracle,MS SQL Server 2005+, Postgresql, Firebird, Maria等等,开源数据库MYSQL中流行...
  • aoxida
  • aoxida
  • 2016年02月18日 23:36
  • 3155

高级数据库六:浅谈数据库的多版本并发控制(MVCC)

多版本并发控制Multi-Version Concurrency Control 基础理解 事务T1改变数据V1,将其改为数据V2,在堆中,数据如下图 事务T3改变了V2,将其改为V3,...
  • u013007900
  • u013007900
  • 2017年11月27日 09:42
  • 478

详解SQL Server 2008多版本的并发控制

【IT168 技术文档】数据库的一致性,也是衡量DBMS性能的重要指标之一。目前大多数商业数据库(DB2, SQL Server)的并发控制采用的是两阶段锁(Two-Phase Locking,2PL...
  • tianlianchao1982
  • tianlianchao1982
  • 2012年10月10日 10:43
  • 1039

MySQL读书笔记-MVCC多版本并发控制

MySQL的大多数事务型存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC)。 不仅是MySQL,包括Oracle, PostgreSQL...
  • delphiwcdj
  • delphiwcdj
  • 2016年07月19日 23:20
  • 887

深度解析MySQL—InnoDB多版本并发控制(MVCC)

前言我们知道,InnoDB的默认事务隔离级别是REPEATABLE_READ,可以防止脏读和不可重复读,但幻读仍可能发生,当我们对MySQL进行并发读写时,MySQL如何确定给我们返回哪一版本的数据呢...
  • heroqiang
  • heroqiang
  • 2018年01月10日 15:24
  • 52

MySQL MVCC(多版本并发控制)

概述   为了提高并发MySQL加入了多版本并发控制,它把旧版本记录保存在了共享表空间,在事务未提交之前对应的行记录还是受到锁的限制,当事务提交之后对应的记录行就在缓存中被修改了记录也被持久化了,当...
  • cmh200704
  • cmh200704
  • 2016年03月17日 09:37
  • 334

InnoDB的MVCC如何解决幻读

InnoDB默认的隔离级别是RR(可重复读),可以解决脏读和不可重复读,但是不能解决幻读问题。 什么是幻读? 事务A读取了一个范围内的数据,此时事务B在该范围内插入了一条数据,并立马提交了事务,此...
  • fanghanwen_fei
  • fanghanwen_fei
  • 2017年09月07日 18:00
  • 566

mysql的mvcc(多版本并发控制)

http://www.cnblogs.com/dongqingswt/p/3460440.html 我们知道,mysql的innodb采用的是行锁,而且采用了多版本并发控...
  • zdy0_2004
  • zdy0_2004
  • 2016年07月13日 16:19
  • 266
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MySQL 多版本并发控制(MVCC)
举报原因:
原因补充:

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