实现mvcc_MySQL 的多版本并发控制(MVCC) 是干啥的?

点击蓝色“架构文摘”关注我哟

加个“星标”,每天上午 09:25,干货推送!

b76f34377a645409fb5fc33e88ab0d2c.png

来源:https://segmentfault.com/a/1190000037557620
作者:白菜1031

一、什么是多版本并发控制

多版本并发控制 技术的英文全称是 Multiversion Concurrency Control ,简称 MVCC

多版本并发控制(MVCC)
是通过保存数据在某个时间点的快照来实现并发控制的。也就是说,不管事务执行多长时间,事务内部看到的数据是不受其它事务影响的,根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。

简单来说, 多版本并发控制
的思想就是保存数据的历史版本,通过对数据行的多个版本管理来实现数据库的并发控制。这样我们就可以通过比较版本号决定数据是否显示出来,读取数据的时候不需要加锁也可以保证事务的隔离效果。

可以认为 多版本并发控制(MVCC)
是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。虽然实现机制有所不同,但大都实现了非阻塞的读操作,写操作也只锁定必要的行。

MySQL的大多数事务型存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC)。不仅是MySQL,包括Oracle、PostgreSQL等其他数据库系统也都实现了MVCC,但各自的实现机制不尽相同,因为MVCC没有一个统一的实现标准,典型的有乐观(optimistic)并发控制悲观(pessimistic)并发控制

二、多版本并发控制解决了哪些问题

1. 读写之间阻塞的问题

通过 MVCC 可以让读写互相不阻塞,即读不阻塞写,写不阻塞读,这样就可以提升事务并发处理能力。

提高并发的演进思路:

  • 普通锁,只能串行执行;

  • 读写锁,可以实现读读并发;

  • 数据多版本并发控制,可以实现读写并发。

2. 降低了死锁的概率

因为 InnoDB 的 MVCC 采用了乐观锁的方式,读取数据时并不需要加锁,对于写操作,也只锁定必要的行。

3. 解决一致性读的问题

一致性读也被称为 快照读
,当我们查询数据库在某个时间点的快照时,只能看到这个时间点之前事务提交更新的结果,而不能看到这个时间点之后事务提交的更新结果。

三、快照读与当前读

快照读(SnapShot Read) 是一种 一致性不加锁的读 ,是 InnoDB并发如此之高的核心原因之一

这里的 一致性 是指,事务读取到的数据,要么是 事务开始前就已经存在的数据 ,要么是 事务自身插入或者修改过的数据

不加锁的简单的 SELECT 都属于 快照读 ,例如:

    `SELECT * FROM t WHERE id=1`

快照读 相对应的则是 当前读当前读 就是读取最新数据,而不是历史版本的数据。加锁的 SELECT 就属于当前读,例如:

    SELECT * FROM t WHERE id=1 LOCK IN SHARE MODE;

    SELECT * FROM t WHERE id=1 FOR UPDATE;

四、InnoDB 的 MVCC 是如何工作的

1. InnoDB 是如何存储记录的多个版本的

事务版本号

每开启一个事务,我们都会从数据库中获得一个事务 ID(也就是事务版本号),这个事务 ID 是自增长的,通过 ID 大小,我们就可以判断事务的时间顺序。

行记录的隐藏列

InnoDB 的叶子段存储了数据页,数据页中保存了行记录,而在行记录中有一些重要的隐藏字段:

  • DB_ROW_ID :6-byte,隐藏的行 ID,用来生成默认聚簇索引。如果我们创建数据表的时候没有指定聚簇索引,这时 InnoDB 就会用这个隐藏 ID 来创建聚集索引。采用聚簇索引的方式可以提升数据的查找效率。

  • DB_TRX_ID :6-byte,操作这个数据的事务 ID,也就是最后一个对该数据进行插入或更新的事务 ID。

  • DB_ROLL_PTR :7-byte,回滚指针,也就是指向这个记录的 Undo Log 信息。

a42655300259aab9d002adb24584b733.png
InnoDB数据记录隐藏列
Undo Log

InnoDB 将行记录快照保存在了 Undo Log 里,我们可以在回滚段中找到它们,如下图所示:

4908552135540b75c86093a29112aedc.png
Undo Log回滚历史记录

从图中能看到回滚指针将数据行的所有快照记录都通过链表的结构串联了起来,每个快照的记录都保存了当时的 db_trx_id,也是那个时间点操作这个数据的事务
ID。这样如果我们想要找历史快照,就可以通过遍历回滚指针的方式进行查找。

2. 在 可重复读(REPEATABLE READ) 隔离级别下, InnoDB 的 MVCC 是如何工作的

查询(SELECT)

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

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

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

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

插入(INSERT)

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

删除(DELETE)

InnoDB为删除的每一行保存当前系统版本号作为行删除标识。 
删除在内部被视为更新,行中的一个特殊位会被设置为已删除。

更新(UPDATE)

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

五、总结

多版本并发控制(MVCC) 在一定程度上实现了 读写并发 ,它只在 可重复读(REPEATABLE READ)提交读(READ COMMITTED) 两个隔离级别下工作。其他两个隔离级别都和 MVCC 不兼容,因为 未提交读(READ UNCOMMITTED) ,总是读取最新的数据行,而不是符合当前事务版本的数据行。而 可串行化(SERIALIZABLE)
则会对所有读取的行都加锁。

行锁,并发,事务回滚 等多种特性都和MVCC相关。

参考

MySQL5.7文档:innodb-multi-versioning  
《高性能MySQL》

end

推荐阅读:

  • TCP 三次握手、四手挥手,这样说你能明白吧!

  • 拜托,不要再问我线程池啦!

  • 为什么 Redis 单线程还这么快?

  • Spring Cloud架构的各个组件的原理分析

  • 一口气说出 5 种 IO 模型,蒙圈了!

faea16d5ad0125ce2df5c63b51026945.png如有收获,点个在看,诚挚感谢3557506916dd5e8d0dd59fc1dbcd9a00.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站访问速度提升200%以上,阿里云虚拟主机支持PHP最新版本

摘要: 日前,阿里云虚拟主机推出了新功能,支持PHP的最新版本 7.0和7.1,并支持用户在多个不同PHP版本之间切换。 PHP 作为最好的Web编程语言,最新版本已经更新到了7.0和7.1。阿里云作为国内虚拟主机的领头羊,…

2019年6月 阿里技术面试题集锦(28道含答案)

戳蓝字“CSDN云计算”关注我们哦!想要入职大厂可谓是千军万马过独木桥。要通过层层考验,刷题肯定是必不可少的。为帮助开发者们提升面试技能、有机会入职阿里,云栖社区特别制作了这个专辑——阿里巴巴资深技术专家们结合多年的工作、面试经验…

一键清理网站木马文件,从此网站拥有专属保镖 ——阿里云虚拟主机推出木马查杀功能...

摘要: 近日,阿里云推出了云虚拟主机网站木马查杀的新功能,十分适合对网站安全不了解、不熟悉的用户,或网站出现挂马情况不清楚如何处理的用户。 阿里云表示,此次网站木马查杀功能是阿里云安骑士专为虚拟主机推出的安全…

每天自动备份网站数据,发现问题一键恢复 ——阿里云虚拟主机推出网站数据自动备份功能...

摘要: 近日,阿里云宣布推出虚拟主机网站自动备份功能,可自动备份用户的网站和数据库数据至单独的备份区域,用户可随时恢复前三天的网站和数据库的数据。一旦出现意外或者数据丢失情况,可将损失降低到最低。 数据是用户…

如何快速下载CentOS7镜像

在centOS官网下载很慢,因此记录哪里下载比较快,其实就是 开源镜像网站网址阿里巴巴开源镜像站https://opsx.alibaba.com/mirror网易163开源镜像网站http://mirrors.163.com/ 下载entOS7步骤: 以阿里巴巴开源镜像网站作演示: 1.进…

pypi.python.org_在Pypi上发布自己的Python包

使用Python编程的都知道,Python的包安装非常的方便,一般都是可以pip来安装搞定:sudo pip install 最近因为项目上的需要,发布了一个自己的pypi Python包,这里我大致分享如何发布自己的Pypi包一般过程。打包工作主要依赖…

20大5G关键技术

戳蓝字“CSDN云计算”关注我们哦!来源 | 北京物联网智能技术应用协会5G网络技术主要分为三类:核心网、回传和前传网络、无线接入网。核心网核心网关键技术主要包括:网络功能虚拟化(NFV)、软件定义网络(SDN&…

AliOS Things网络连接技术概述

摘要: AliOS Things具有非常丰富的连接组件和能力,主要包括: 自组织网络协议(uMesh), 套接字适配层(SAL),TCP/IP网络协议栈(LwIP)和连接协议(WiFi,BLE, LoRaWAN, GPRS和NB-IoT等) AliOS Things 是 AliOS 家族旗下的、面向 IoT 领域…

SCDN的抗CC攻击和抗DDoS攻击防护是什么?

摘要: 阿里云SCDN提供的一整套加速和安全的解决方案。目前SCDN抗CC防护保底6万QPS,最高到100万QPS。另可定制最高达250万QPS防护。而抗DDoS保底防护20Gbps,最高到300Gbps。另可定制最高达600Gbps防护。 CC攻击是什么? CC攻击是 D…

命令启动jar包_java项目打jar包,一句命令搞定

jar命令格式:jar {c t x u f }[ v m e 0 M i ][-C 目录]文件名其中{ctxu}这四个参数必须选选其一。[v f m e 0 M i ]是可选参数,文件名也是必须的。所有的参数说明:-c 创建一个jar包-t 显示jar中的内容列表-x 解压jar包-u 添加文件到jar包中-…

Linux:查询当前进程或线程的资源使用情况

目录 一、/proc/[PID]/下的各个文件1、proc简介2、/proc/[PID]/详解 二、通过Linux API获取当前进程或线程的资源使用情况1、getrusage2、sysinfo3、times 在工作中,我们排除app出现的一些性能/资源问题时,通常要先知道当前app的资源使用情况&#xff0c…

如何使用API提交转码任务?

摘要: 当常规的转码工作流无法满足用户的场景时,需用户自己判断业务逻辑,并使用API提交转码任务。例如:并不是所有的视频都需要转码,不同视频需要设置不同的转码配置。本文将介绍API提交转码任务的方法。 当常规的转码…

微博短视频千万级高可用、高并发架构如何设计?

作者:刘志勇,本文来自新浪微博视频平台资深架构师刘志勇在 LiveVideoStackCon 2018 讲师热身分享,并由 LiveVideoStack 整理而成。 本文从设计及服务可用性方面,详细解析了微博短视频高可用、高并发架构设计中的问题与解决方案。…

三点估算pmp_【每日一练】PMP项目管理专业资格认证考试练习题(十)

听说99%的同学都来这里充电吖【习题】1.客户提出的一项需求,将变更项目范围。如果变更控制委员会批准需求,执行变更的成本将影响项目的预算。如果这项需求获得批准,项目经理应该考虑从下列哪一项储备中申请资金?A. 管理储备 …

我使用阿里云做直播,有什么手段保护直播安全?

摘要: 准备工作 开通阿里云直播服务:阿里云直播服务接收直播流,并提供直播播放地址,完成一场直播需要先开通阿里云直播服务,在 直播官网详情页 中单击 立即开通 ,开通阿里云直播服务。 如您已经能够使用阿里…

Activiti6 use spring-boot-starter-web meet requestMappingHandlerMapping error

解决方案: SpringBootApplication(exclude SecurityAutoConfiguration.class)参考链接:https://hub.alfresco.com/t5/alfresco-process-services/activiti6-use-spring-boot-starter-web-meet/m-p/125303

高级算法专家储开颜:无端不视频 阿里视频云三大端上技术能力

摘要: 阿里云拥有领先的云计算能力和丰富完善的基础设施,我们可以看到云上面的视频能力越来越强,我们可以在云端构建导播台、进行视频剪辑和个性化处理、极速转码、安全高效进行内容分发等等。而在储开颜看来,端也是很重要的一块。…

分布式精华问答 | 秒懂分布式与集群的区别

布式的处理方式越来越受到业界的青睐——计算机系统正在经历一场前所未有的从集中式向分布式架构的变革。今天,我们就来看看关于分布式的精华问答吧!1Q:什么是分布式系统?A:要理解分布式系统,主要需要明白一…

一张图看懂阿里云网络产品[二] 专有网络VPC

摘要: 一张图看懂网络产品系列文章,让用户用最少的时间了解网络产品,本文章是第二篇 专有网络VPC 一张图看懂阿里云网络产品系列文章,让用户用最少的时间了解网络产品,本文章是第二篇 专有网络VPC 系列文章持续更新中&…

终于!华为在欧盟注册新商标“Harmony”;亚马逊AWS宣布张文翊“新官上任”;甲骨文失去竞购100亿美元国防部云计算合同资格...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go 谷歌打算推出名为“鞋带”&a…