MySQL学习----多版本并发mvcc

ricklz 2018-09-05 原文

MySQL学习—-多版本并发mvcc

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则会对所有的读取行加锁。

  

  

 

  

 

发表于 2018-09-05 19:46 乔克叔叔lz 阅读() 评论() 编辑 收藏

 

版权声明:本文为ricklz原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ricklz/p/9594077.html

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

  1. MySQL SQL优化

    前言 有人反馈之前几篇文章过于理论缺少实际操作细节,这篇文章就多一些可操作性的内容吧。 注:这篇文章是以 My […]...

  2. pt-online-schema-change 大数据表结构修改

    使用场景: 在线修改大数据量表结构(ALTER tables without locking them) 文档 […]...

  3. MySQL中使用sql语句获得表结构

    最近在研究PHP,那么就必须涉及到mysql。其中一个功能通过表数据自动生成页面,紧接着发现在一张空表中无法读 […]...

  4. ubuntu18.04搭建WEB环境(php7+flask+mysql8)之笔记一

      世界杯期间看球闲着无聊,于是边看球边准备搭建一个WEB开发环境,于是动手先在VMware WorkStat […]...

  5. 面试官:不会sql优化?出门右转顺便带上门,谢谢

    导读 作为一个后端程序员,数据库这个东西是绕不开的,特别是写sql的能力,如果您参加过多次面试,那么一定会从面 […]...

  6. MySql入门

    一.定义   MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle  […]...

  7. MySQL进阶篇(02):索引体系划分,B-Tree结构说明

    本文源码:GitHub·点这里 || GitEE·点这里 一、索引简介 1、基本概念 首先要明确索引是什么:索 […]...

  8. mysql Update语句 语法 – 佰草伐

    mysql Update语句 语法 mysql Update语句 语法 作用:用于修改表中的数据。广州大理石机 […]...

随机推荐

  1. Mybatis源码解析3——核心类SqlSessionFactory,看完我悟了

    Mybatis源码解析3——核心类SqlSessionFactory,看完我悟了 这是昨晚的武汉,晚上九点钟拍 […]...

  2. scrapy 使用下载器中间件设置随机请求头

    scrapy 使用下载器中间件设置随机请求头 1. 在middlewares.py 中设置下载中间件 impo […]...

  3. Spring Boot入门篇(基于Spring Boot 2.0系列)

    1:概述: Spring Boot是用来简化Spring应用的初始化开发过程。 2:特性: 创建独立的应用(j […]...

  4. vue+element-ui中引入阿里播放器

    需求: 1.一次只能播放一个视频。 2.播放页面禁止刷新。 3.打开视频若该视频之前已经学习过一段时间,则再次 […]...

  5. 一种快速UWB 测距方法(单周期法) — 原理说明

    UWB测距官方提供的方法是通过三条信息获得两个模块距离,这里介绍一种简单的,快速测距方法。 这种测距方法适合少 […]...

  6. 一个简简单单的红点系统框架

    前言 今天我们简简单单做一个红点系统框架。在应用和游戏中,按钮上的红点非常常见。如图所示: 红点会让强迫症烦躁 […]...

  7. 1500+人参与的云开发0基础训练营又来啦!

    不知不觉,云开发0基础训练营已经来到第四期! 前三期中,我们通过干货满满的课程、细致及时的答疑吸引了1500+ […]...

  8. 研究虚拟现实时的经典调查问卷

    在之前的一篇随笔中提到了,我们对一个虚拟现实(VR)体验的设计进行评估,包括这些方面:认知(congnitio […]...

展开目录

目录导航