技术分享 | MySQL 多版本并发控制「MVCC」

news2024/11/24 12:04:10

作者:贲绍华

爱可生研发中心工程师,负责项目的需求与维护工作。其他身份:柯基铲屎官。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


一、MySQL InnoDB引擎事务隔离级别与并发问题

本文以MySQL 5.7版本为例进行说明,开始前让我们先简单复习一下InnoDB引擎下的四种隔离级别与三种并发场景下存在的问题,内容如下:

二、Undo Logs

MySQL的Undo Logs保证了数据的原子性,它保存了事务发生之前的数据的一个版本,可以用于事务回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读。Undo Logs内部分为两种类型,它们分别是:

TRX_UNDO_INSERT:

由insert语句产生的undo日志,在事务提交后可以直接删除。只有事务回滚时产生作用;

TRX_UNDO_UPDATE:

除TRX_UNDO_INSERT以外,其他都属于该类型(包括删除),事务提交后还可能会被MVCC用到,不会立即清理;

每个事务都会维护INSERT和UPDATE两种类型的Undo的链表

三、多版本并发控制「MVCC」(Multi Version Concurrency Control)

Acronym for “multiversion concurrency control”. This technique lets
InnoDB transactions with certain isolation levels perform consistent read operations; that is, to query rows that are being updated by other transactions, and see the values from before those updates occurred. This is a powerful technique to increase concurrency, by allowing queries to proceed without waiting due to locks held by the other transactions.

在InnoDB引擎下,运行同一行内容在不同事务之间读写互不干扰,这是我们经常会碰到的业务场景,它也被认为是理所当然的。而实现这一特性的实现其实会比描述起来复杂得多。

MVCC就是允许在特定隔离级别的 InnoDB 引擎下,对事务执行一致的读操作。避免了并发事务下对一般类型查询的锁竞争,也是一种增强并发事务读写能力的功能。

就像一位称职的摄像师,在你每个人生的高光点都会按下快门记录当下与之前的影像。

它本质上就是一个链表,每一行内容的版本都指向上一个版本,其中也除了数据本身,还包含了事务可见性的信息在内,通过这些可见性信息用于判断哪个版本才能对当前的该查询可见。

四、快照读「Read View」

当多个事务同时操作同一份数据内容时,可以分为两种获取方式:当前读、快照读。

  • 当前读

直接从磁盘或buffer中获取当前内容的最新数据,读到什么就是什么。根据隔离级别的不同期间会产生一些锁,防止并发场景下其他事务产生影响;

在官方叫做 Locking Reads(锁定读取):https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html

  • 快照读

简单的SELECT操作(不包括lock in share mode,for update),根据隔离级别的不同,会在不同时机产生快照,事务读取的实际是快照内容,保证一致性的同时减少了锁之间的竞争;

官方叫做 Consistent Nonlocking Reads(一致性非锁定读取,也叫一致性读取): https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html

下面来看一下,在MySQL 5.7的源码中,对于MVCC read view结构是如何定义的:

字段名释义
m_low_limit_id下一个待分配的事务ID(当前Max trx_id + 1)
m_up_limit_id最小活跃事务ID
m_creator_trx_id触发创建该ReadView的事务ID
m_ids该ReadView创建时,处于【当前活跃】状态的事务ID有序集合
m_low_limit_no最后一个提交的事务number,事务提交时候获取同时写入Undo log中的值,事务Number小于该值的对该ReadView不可见。利用该信息可以Purge不需要的Undohttps://dev.mysql.com/doc/refman/5.7/en/innodb-purge-configuration.html
m_closed标记该ReadView是否已经closed,用于优化减少trx_sys->mutex这把大锁的使用
m_view_list用于存储ReadView的链表信息

这里的字段大部分都是为了确保这份Readview是否能被其他事务所"看见"的条件,关于可见性的判断就不在此详细说明了。

五、ReadView的创建与关闭

对于ReadView来说,在不同的隔离级别下它们的创建与关闭时机会存在区别,具体如下:

  • 读提交 ( READ COMMITTED )「RC」

在READ COMMITTED事务隔离级别下,每次语句执行都关闭ReadView,然后重新创建一份ReadView

  • 可重复读 ( REPEATABLE READ )「RR」
innobase_start_trx_and_assign_read_view(
/*====================================*/
   handlerton*    hton,  /*!< in: InnoDB handlerton */
   THD*      thd)   /*!< in: MySQL thread handle of the user for
            whom the transaction should be committed */
{
   ......
   /* 在RR级别下,使用start transaction with consistent snapshot会直接创建视图,否则会在第一条SELECT语句时创建 */
   /* 快照会在事务结束时关闭,整个事务生命周期内共享同一个快照 */
   /* Assign a read view if the transaction does not have it yet.
   Do this only if transaction is using REPEATABLE READ isolation
   level. */
   trx->isolation_level = innobase_map_isolation_level(
      thd_get_trx_isolation(thd));

   if (trx->isolation_level == TRX_ISO_REPEATABLE_READ) {
      trx_assign_read_view(trx);
   } else {
      push_warning_printf(thd, Sql_condition::SL_WARNING,
                HA_ERR_UNSUPPORTED,
                "InnoDB: WITH CONSISTENT SNAPSHOT"
                " was ignored because this phrase"
                " can only be used with"
                " REPEATABLE READ isolation level.");
   }

六、为什么说RR级别下并没有完全解决幻读?

以下通过两个例子来说明RR级别下也能出现幻读的场景,创建一个test表,只有一个id(pk AUTO_INCREMENT)的字段:

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

案例一:

案例二:

在RR级别下普通查询是快照读,并不会看到其他事务插入的数据。这种幻读情况只有在快照读与当前读混合使用的情况下才会出现,这部分也是争议比较多的地方。

然而当前读的定义就是能从buffer或磁盘获取到已提交数据的最新值,所以这跟事务的可见性其实并不矛盾。

七、相关资料:

https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html

https://dev.mysql.com/doc/dev/mysql-server/latest/classReadView.html

https://dev.mysql.com/doc/refman/5.7/en/innodb-multi-versioning.html

https://developer.aliyun.com/article/928196

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

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

相关文章

TaxiBGC ——分类学指导下的生物合成基因簇鉴定流程

谷禾健康 当前合成基因簇预测限制较大 微生物基因组中的生物合成基因簇 (BGC) 编码具有生物活性的次级代谢物 (SM)&#xff0c;它可以在微生物-微生物和宿主-微生物相互作用中发挥重要作用。 鉴于次级代谢物的生物学意义和当前对微生物组代谢功能的深刻兴趣&#xff0c;从高通…

通过 ffmpeg 串流对接 OBS 等直播软件

我们要将设备通过私有通道输出到 H264 流&#xff0c;传给 OBS 等直播软件使用。为此&#xff0c;设计了上图所示的串流工具。 设计思路 私有通道通过 API 接口提供 H264 流&#xff0c;要传给 ffmpeg &#xff0c;最简单的方法是通过进程间管道传输数据。这里 Dump 工具直接…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java美丽华驾校信息管理系统t93d7

毕业设计也不需要做多高端的程序&#xff0c;毕业设计对于大多数同学来说&#xff0c;为什么感觉到难&#xff0c;最重要的一个原因&#xff0c;那就是理论课到实践课的转变&#xff0c;很多人一下不适应&#xff0c;本能开始拒绝&#xff0c;如果是一个考试&#xff0c;大家都…

使用自定义函数实现数据编解码、格式处理与业务告警

背景 在物联网平台的设备数据接入场景中&#xff0c;开发者总是希望平台接入的设备数据格式标准统一&#xff0c;以便对数据进行统一处理。在实际情况中&#xff0c;由于业务需要&#xff0c;平台常常会面对不同类型、不同厂商的设备接入。即使设备接入协议已经统一使用 MQTT …

傻白探索Chiplet,Chiplet技术带来的“新四化”(三)

目录 一、IP芯片化 二、异质集成&#xff08;HeteroMaterial Integration&#xff09; 三、异构集成&#xff08;HeteroStructure Integration&#xff09; 四、IO增量化 五、总结 一、IP芯片化 IP&#xff08;Intelligent Property&#xff09;是具有知识产权核的集成电…

腾讯前端常考vue面试题(必备)

虚拟DOM的优劣如何? 优点: 保证性能下限: 虚拟DOM可以经过diff找出最小差异,然后批量进行patch,这种操作虽然比不上手动优化,但是比起粗暴的DOM操作性能要好很多,因此虚拟DOM可以保证性能下限无需手动操作DOM: 虚拟DOM的diff和patch都是在一次更新中自动进行的,我们无需手动…

driftingblues2靶机(nmap提权)

环境准备 靶机链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;9qkq 虚拟机网络链接模式&#xff1a;桥接模式 攻击机系统&#xff1a;kali linux 2021.1 信息收集 1.探测目标靶机 2.探测目标靶机开放端口和服务 3.用dirsearch扫描目录 dirsearch -u 192.168.…

π120E31兼容Si8620EC-B-IS 双通道数字隔离器

π120E31兼容Si8620EC-B-IS 双通道数字隔离器。具有出色的性能特征和可靠性&#xff0c;整体性能优于光耦和基于其他原理的数字隔离器产品。 传输通道间彼此独立&#xff0c;可实现多种传输方向的配置&#xff0c;可实现3.0kVrms隔离耐压等级和 DC 到 600Mbps 信号传输。该系列…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java校园兼职招聘系统x6u36

毕业设计说实话没有想象当中的那么难&#xff0c;导师也不会说刻意就让你毕设不通过&#xff0c;不让你毕业啥的&#xff0c;你只要不是太过于离谱的&#xff0c;都能通过的。首先你得要对你在大学期间所学到的哪方面比较熟悉&#xff0c;语言比如JAVA、PHP等这些&#xff0c;数…

腾讯会议一直显示正在加入会议如何处理?

我们在使用腾讯会议时&#xff0c;一直显示正在加入会议&#xff0c;但是经过很长时间也没有反应&#xff0c;这该怎么办&#xff1f;下面小编就给大家带来了相关的解决办法&#xff0c;说不定有用。 腾讯会议一直显示正在加入会议怎么办&#xff1f; 1、手机上打开腾讯会议。 …

交易所步入「后FTX 时代」,WEEX唯客等后发新秀拉开补位战?

太阳底下没有新鲜事&#xff0c;11月上旬 FTX此轮的骤然崩溃&#xff0c;再次证明了加密行业没有「大而不能倒」的神话&#xff0c;也在一定程度上引爆了加密行业的信任危机与流动性困境。 但把盖子掀开、暴露出里面的风险&#xff0c;未尝不是一件好事——缺乏风控合规的中心…

【剧前爆米花--爪哇岛寻宝】面向对象的三大特性——封装、继承以及多态的详细剖析(下——封装)。

作者&#xff1a;困了电视剧 专栏&#xff1a;《JavaSE语法与底层详解》 文章分布&#xff1a;这是一篇关于Java面向对象三大特性——封装的文章&#xff0c;在本篇文章中我会分享封装的一些基础概念以及实现。 目录 封装定义和优点 访问限定符实现封装 private限定符 priv…

深度学习-LeNet(第一个卷积神经网络)

文章目录简介数据集模型搭建模型训练模型测试前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 LeNet模型是在1998年提出的一种图像分类模型&#xff0c;应用于支票或邮件编码上的手写…

双模蓝牙MIDI模块BT401的功能简单描述和蓝牙MIDI协议

目录 一、蓝牙MIDI概念和功能简述 蓝牙MIDI&#xff0c;实际上是由苹果公司推广并且应用的&#xff0c;目的是借助于低功耗蓝牙来实现 主机和设备之间的无线连接 。协议的标准也是苹果定的。目前也充分的应用到安卓平台了 二、详细记录--功能说明 2.1 蓝牙MIDI的测试说明--m…

【笔记】计算机组成原理复习重点——篇三

计算机组成原理复习重点笔记 第二篇 计算机系统的硬件结构 第3章 系统总线第4章 存储器第5章 输入输出系统 第&#xff13;章 系统总线 3.1 总线的基本概念 一、为什么要用总线 计算机的各个系统功能部件连在一起才能协同工作&#xff0c;部件之间不可能采用全互联形式&…

MATLB|基于复杂网络的配电系统微电网优化配置

目录 一、概述 二、系统研究 三、复杂网络框架 四、结果与讨论 五、Matlab代码实现 一、概述 多年来&#xff0c;各个领域的科学家开发了一套广泛的工具&#xff1a;数学、计算和统计&#xff0c;旨在分析、建模和理解网络。网络研究的基础可以追溯到图论的发展&#xff0…

第三方软件测试机构如何选择?

什么是软件产品检测报告&#xff1f; 软件测试机构根据委托方提供的测试需求&#xff0c;对软件进行功能性的检测&#xff0c;保证软件功能能正常运行。 软件产品登记测试也是申请软件产品登记的必要条件&#xff0c;对于买方来说&#xff0c;通过第三方检测机构出具的测试报告…

yolov5修改骨干网络-使用自己搭建的网络-以efficientnetv2为例

yolov5修改骨干网络–原网络说明 yolov5修改骨干网络-使用pytorch自带的网络-以Mobilenet和efficientnet为例 yolov5修改骨干网络-使用自己搭建的网络-以efficientnetv2为例 增加网络的深度depth能够得到更加丰富、复杂的特征并且能够很好的应用到其它任务中。但网络的深度过深…

全面适配 Android12

本文目录 背景技术分析实战总结与展望 背景 2021 年 10 月 5 日 Google 发布 Android12 操作系统&#xff0c;安全性和隐私性大幅提升&#xff0c;各手机厂家陆续更新 Android12 操作系统。 2022 年随着各大 APP 应用市场推动 Android12 适配工作&#xff0c;开发者积极响应…

应用性能监控管理工具

应用程序性能监控 Application Manager 的应用程序性能监控&#xff08;APM Insight&#xff09; 使应用程序开发人员和 DevOps 工程师能够了解应用程序性能&#xff0c;并帮助他们在问题影响最终用户之前对其进行故障排除。在应用程序性能问题影响收入之前监控、查明并解决它…