MySQL中的大多数事务性存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,他们一般实现了多版本并发控制(mvcc)。不仅是mysql,包括oracle,postgresql等其他数据库也实现了mvcc,但各自的实现机制不尽相同,应为mvcc没有一个统一的实标准。

那么什么是mvvc呢

可以认为mvcc是一个行级锁的变种,但是他们在大多数情况下避免了加锁的操作,因此开销更低。虽然实现的机制不同,但是大都实现了非阻塞的操作,写操作也只锁定必要的行。

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

不同的存储引擎对mvcc实现是不同的,典型的有乐观并发控制和悲观并发控制。

InnoDB的mvcc,是通过每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了创建的时间,一个保存了过期的时间(或删除时间)。当然存储的并不是实际的时间,而是系统的版本号。每开始一个新的事物,系统的版本号就会自动递增。事物开始时刻的系统版本号会作为事物的版本号,用来和查询到的每行记录的版本号进行比较。下面是一个REPEATABLE READ隔离级别下,mvcc具体是如何实现操作的。

select

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

a、InnoDB只查找版本早于当前事物版本的数据行(也就是说,行的版本号小于或等于事物的系统版本号),这样可以确保事物读取的行,要么是在事物开始前已经存在的,要么事物自身插入或         修改的。

b、行的删除版本要么未定义,要么大于当前事物的版本号。这可以确保事物读取到的行,在事物开始前就被删除。

insert

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

delete

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

update

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

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

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

MySQL学习----多版本并发mvcc的更多相关文章

  1. Mysql InnoDB多版本并发控制MVCC

    参考书籍<mysql是怎样运行的> 系列文章目录和关于我 一丶为什么需要事务隔离级别 mysql是一个客户端/服务断软件,对于同一个服务器来说,可以有多个客户端进行连接,每一个客户端进行连 ...

  2. 《高性能Mysql》解读---Mysql的事务和多版本并发

    1.base:ACID属性,并发控制 2.MySql事务的隔离级别有哪些,含义是什么? 3.锁知多少,读锁,写锁,排他锁,共享锁,间隙锁,乐观锁,悲观锁. 4.Mysql的事务与锁有什么关联?MySq ...

  3. Mysql加锁过程详解(5)-innodb 多版本并发控制原理详解

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  4. 【大白话系统】MySQL 学习总结 之 缓冲池(Buffer Pool) 如何支撑高并发和动态调整

    如果大家对我的 [大白话系列]MySQL 学习总结系列 感兴趣的话,可以点击关注一波. 一.上节回顾 在上节< 缓冲池(Buffer Pool) 的设计原理和管理机制>中,介绍了缓冲池整体 ...

  5. mysql学习之-三种安装方式与版本介绍

    MYSQL版本介绍 mysql分alpha,beta,rc,GA四个版本. alpha  暗示这是一个以展示新特性为目的的版本,存在比较多的不稳定因素,还会向代码中添加新新特性beta 以后的beta ...

  6. MySQL学习笔记-事务相关话题

    事务机制 事务(Transaction)是数据库区别于文件系统的重要特性之一.事务会把数据库从一种一致状态转换为另一个种一致状态.在数据库提交工作时,可以确保其要么所有修改都已经保存了,要么所有修改都 ...

  7. MySQL学习——管理事务

    MySQL学习——管理事务 摘要:本文主要学习了使用DCL语句管理事务的操作. 了解事务 什么是事务 事务是一组逻辑处理单位,可以是执行一条SQL语句,也可以是执行几个SQL语句. 事务用来保证数据由 ...

  8. 我的MYSQL学习心得(十六) 优化

    我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  9. 我的MYSQL学习心得(十七) 复制

    我的MYSQL学习心得(十七) 复制 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

随机推荐

  1. hdu5173 How Many Maos Does the Guanxi Worth

    #include<bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f ]; ]; ][]; void dijkstra(i ...

  2. 学习笔记TF014:卷积层、激活函数、池化层、归一化层、高级层

    CNN神经网络架构至少包含一个卷积层 (tf.nn.conv2d).单层CNN检测边缘.图像识别分类,使用不同层类型支持卷积层,减少过拟合,加速训练过程,降低内存占用率. TensorFlow加速所有 ...

  3. Redis源码剖析--列表t_list实现

    Redis中的列表对象比较特殊,在版本3.2之前,列表底层的编码是 ziplist 和 linkedlist 实现的, 但是在版本3.2之后,重新引入了一个 quicklist 的数据结构,列表的底层 ...

  4. java中的数据结构

    1.链表的使用 使用时需要import java.util.List 和 java.util.ArrayList //返回list中的元素个数 int size(); //判断list中是否包含元素, ...

  5. openresty redis all in one docker demo

      一个简单的docker demo 集成openresty+ redis,可以实现基于redis的动态修改反向代理的处理 环境准备 docker-compose 文件 version: " ...

  6. python Console menu

    I just finished a demo which is to provide an easy way to control hardware resources of A sample. Th ...

  7. Python正则表达式学习记录

    常用的命令: http://www.runoob.com/python/python-reg-expressions.html 使用中相关注意问题: 1. 中括号里的表示从N到M需要用横线‘-’, 而 ...

  8. Cobbler自动装机--1

    cobbler介绍 cobbler官网:http://cobbler.github.io/用个人的话来说就是cobbler就是一款通过网络快速安装Linux操作系统的产品.cobbler可以配置,管理 ...

  9. openstack--2--控制节点安装mysql和rabbitmq

    生产中可以把mysql数据库单独安装到一台机器上,这里因为实验机器有限,就把mysql安装到了控制节点 其实openstack每个组件都可以安装到单独的机器上. RabbitMQ介绍 RabbitMQ ...

  10. [转]HashMap的实现原理

    1.    HashMap概述: HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变 ...