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

InnoDB的MVCC之(乐观锁),是通过在每行记录保存两个隐藏列来实现的。这两个列,一个是存创建时间,一个是删除时间,这里的时间指的是,系统版本号,并不是真正的时间值。

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

下面看一个在REPEATABLE READ(可重复读)隔离级别下,MVCC的具体操作:

SELECT

  InnoDB会根据以下两个条件检查每行记录:

  1、InnoDB只查找版本小于或等于当前事务版本的数据行,这样可以确保事务读取的行,是在事务开始前就已经存在的,或者是事务自身插入或者修改过的数据。

  2、行的删除版本要么未定义,要么大于当前事务的版本。这可以确保事务赢取到的行,在事务开始前未被删除。

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

INSERT

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

DELETE

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

UPDATE

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

----------------------------------------------------------------------------------------------------------------------------------------------------------

保存这两个额外的系统版本号,使大多数读操作都可以不用加锁。这样设计使得读数据操作很简单,性能很好。并且也能保证只会读取到符合标准的行。不足之处是每行记录都需要额外的存储空间,需要做更多的检查工作,以及一些额外的维护工作。

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

InnoDB的多版本并发控制(MMVC),布布扣,bubuko.com

时间: 2024-10-12 22:04:09

InnoDB的多版本并发控制(MMVC)的相关文章

Mysql 的InnoDB事务方面的 多版本并发控制如何实现 MVCC

MVCC:Multi-Version Concurrency Control 多版本并发控制.笔者用自己的话对MVCC做一个总结:通过某个时间点上的数据快照对数据的版本控制,目的是为了避免使用各种锁影响并发性能 ●MySQL锁机制 说到锁,MySQL里提供了几种锁机制 读写锁 表锁 (MYISAM使用了表锁)行级锁 (InnoDB使用了行级锁) 第一点: MVCC并不是MySql独有的,Oracle,PostgreSQL等都在使用. MVCC并没有简单地使用行锁,而是使用“行级别锁”(row-l

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

mysql的mvcc(多版本并发控制) 我们知道,mysql的innodb采用的是行锁,而且采用了多版本并发控制来提高读操作的性能. 什么是多版本并发控制呢 ?其实就是在每一行记录的后面增加两个隐藏列,记录创建版本号和删除版本号, 而每一个事务在启动的时候,都有一个唯一的递增的版本号. 1.在插入操作时 : 记录的创建版本号就是事务版本号. 比如我插入一条记录, 事务id 假设是1 ,那么记录如下:也就是说,创建版本号就是事务版本号. id name create version delete

SQL事务的四种隔离级别和MySQL多版本并发控制

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的那些改变时可见的,那些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. ReadUncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结构.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交的数据,也被称之为脏读(Dirty Read) ReadCommitted(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的).它

MySQL MVCC(多版本并发控制)

概述 为了提高并发MySQL加入了多版本并发控制,它把旧版本记录保存在了共享表空间,在事务未提交之前对应的行记录还是受到锁的限制,当事务提交之后对应的记录行就在缓存中被修改了记录也被持久化了,当刷新线程按一定的规律进行刷新的时候行的修改记录被刷新到了物理数据页中,并且共享表空间的中的旧版本记录页也被清除. 正文 多版本并发控制只针对innodb的repeatable read和read committed这两种隔离级别.多版本并发控制的原理就是在每个记录行后面增加两个标示列用来存储该行的状态,分

《高性能MySQL》读书笔记之 MySQL锁、事务、多版本并发控制的基础知识

1.2 并发控制 1.2.1 读写锁 在处理并发读或写时,通过实现一个由两种类型的锁组成的锁系统来解决问题.这两种类型的锁通常被称为 共享锁(shared lock) 和 排它锁(exclusive lock),也叫读锁(read lock)和写锁(write lock). 读锁是共享的,或者说是不互相阻塞的.多个客户端可以在同一时刻读取同一个资源,而互不干扰.写锁则是排他的,也就是说一个写锁会阻塞其他写锁和读锁. 1.2.2 锁粒度 为了提高共享资源的并发性,尽量只锁定需要修改的部分数据,而不

1.4 多版本并发控制

多版本并发控制(Multi-Version Concurrency Control, MVCC)是 MySQL 的 InnoDB 存储引擎实现隔离级别的一种具体方式,用于实现提交读和可重复读这两种隔离级别.而未提交读隔离级别总是读取最新的数据行,无需使用 MVCC.可串行化隔离级别需要对所有读取的行都加锁,单纯使用 MVCC 无法实现. MVCC的实现,是通过保存数据在某个时间点的快照来实现的.也就是说,不管需要执行多长时间,每个事物看到的数据都是一致的. 版本号: 系统版本号:是一个递增的数字

MySQL-InnoDB-MVCC多版本并发控制

一.MySQL可重复读级别下,因为MVCC引起的BUG,下图1为相应的Java代码,其中事务1的生命周期最长,循环开启的事务2.3.4...与事务1存在并发问题 图1 解决方案:将方法userRemoteService.addUser和UserBaseContext.getUserBaseByUserId放在两个方法中,避免事务的并发问题 二.MVCC简介:Multiversion Concurrency Control,多版本并发控制机制,行级锁的一个变种, 但是它在很多情况下避免了加锁操作,

mysql 多版本并发控制

MVCC 通过给每张表多加两个隐藏列来实现,一个保存了行的创建时间,一个保存了行的过期时间(或删除时间),时间对应版本 创建一个新的事务,会创建一个新的版本号 前提条件 a. InnoDB只查找版本早于当前事务版本的数据行 b. 行的删除版本要么未定义,要么大于当前事务版本 处理机制 INSERT InnoDB为新插入的每一行保存当前系统版本号作为行版本号 DELETE InnoDB为删除的每一行保存当前系统版本好作为删除标识 UPDATE InnoDB为插入一行新纪录,保存当前系统的版本号,同

翻译:多版本并发控制

Multiversion concurrency control 多版本并发控制 Multiversion concurrency control (MCC or MVCC), is a concurrency control method commonly used by database management systems to provide concurrent access to the database and in programming languages to impleme