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在并发场景下的问题及解决思路

    MySQL在并发场景下的问题及解决思路 2018-01-15 08:29 by 飘扬的红领巾, … […]...

  2. MySQL和PHP中以整型存储IP地址

    正文:将IP地址以整型存储   一般我们在数据库中会用到ip地址用来查记录的等等,而ip地址是分为四段的,一般 […]...

  3. 一文读懂一条 SQL 查询语句是如何执行的

    MySQL 最重要、最与众不同的特性就是它的可插拔存储引擎架构(pluggable storage engin […]...

  4. mysql 使用说明-1

    以下内容是根据官方文档翻译的,执行截图是博主自己实测结果。 3.1 Connecting to and Dis […]...

  5. 解决 MariaDB无密码就可以登录的问题

    问题: 使用apt-get来安装mysql,安装好之后发现安装的是 MariaDB,如下,无需密码既可以登录了 […]...

  6. 面试系列——Mysql索引

    面试系列——Mysql索引 1、索引分类 Hash索引Hash 索引查询效率很高,时间复杂度O(1)。Mysq […]...

  7. 史上最全mysql删库跑路必会姿势

    基础篇:MySql架构与存储引擎 逻辑架构图:        连接层:   mysql启动后(可以把mysql […]...

  8. SparkStreaming动态读取配置文件

    SparkStreaming动态读取配置文件 SparkStreaming动态读取配置文件 标签: Spark […]...

随机推荐

  1. R语言 fitted() 和 predict()函数

    总结来说,fitted(拟合)是在给定样本上做预测,而predict(预测)是在新的样本上做预测。 以前一篇中 […]...

  2. 【转】程序员:伤不起的三十岁

    本文转自:http://bbs.csdn.net/topics/390493660 程序员干到30岁,好不容易 […]...

  3. arp报文格式解析

    arp报文格式   arp报文总共42 bytes。其中以太网首部14 bytes,arp字段28字节 一、以 […]...

  4. 对于只有独显的笔记本,安装ubuntu16.04双系统的办法

      我的电脑是只有一个nvida独显的笔记本,嗯,没错,我就是用游戏本搞开发的那个人!本文主要记录我在安装双系 […]...

  5. 使用WPS的API转换word、excel、ppt为PDF问题

    环境:win7 64位 WPS Office 个人版 2013 使用WPS的API转换PDF,在程序中运行正常 […]...

  6. 淘宝,京东,苏宁易购技术架构(路线)分析和比较

    淘宝,京东,苏宁易购技术架构(路线)分析和比较 最近因为参与项目的关系,对淘宝,京东,苏宁易购三家网站系统构架 […]...

  7. Matlab工具箱安装体会

    Matlab工具箱安装体会 总结有两点: 1、如需添加jar包等附加库,可在待安装工具箱下,新建一个java文 […]...

  8. 2019Unite大会

    一年一度的Unite大会,在今年(2019)的5月10日准时在上海的国际会议中心盛大举行。本届大会历时三天,由 […]...

展开目录

目录导航