MySQL-MVCC举例说明

news2024/9/20 10:49:59

在数据库系统中,多版本并发控制(MVCC, Multi-Version Concurrency Control) 是一种用于提高并发性能的机制,它允许多个事务同时读取和写入数据,而不会产生锁等待和阻塞的问题。MySQL 的 InnoDB 存储引擎广泛使用了 MVCC 来处理并发事务。为了深入理解 MVCC 的工作原理,我们需要了解事务、版本链、Read View 的概念。

1. 事务和版本链

1.1 事务的基本概念
  • 事务(Transaction) 是数据库中的一个操作序列,这些操作要么全部执行成功,要么全部撤销。事务具有四个特性:原子性、一致性、隔离性、持久性(ACID)。
  • 在 MVCC 中,每个事务都有一个唯一的事务 ID(trx_id),用于标识事务。
1.2 版本链
  • 在 InnoDB 中,每一行数据都有一个隐藏的列 trx_id,记录了最后一次修改该行的事务 ID。
  • 当一条记录被更新时,InnoDB 并不会立即删除旧的记录,而是将新的记录作为一个版本(新版本)插入,并将旧记录保留作为历史版本。
  • 这些历史版本通过指针链接起来,形成一个版本链。最新的记录在链的头部,旧版本依次排在后面。

2. Read View 和 MVCC

在 MVCC 中,事务在读取数据时会创建一个 Read View。Read View 记录了当前数据库中活跃事务的状态,并通过它来决定哪些数据版本对当前事务可见,哪些不可见。

2.1 Read View 的关键属性

在创建 Read View 后,我们可以将记录中的 trx id 划分这三种情况:
在这里插入图片描述

  • min_trx_id:当前系统中所有未提交事务的最小事务 ID。表示在 Read View 创建时,所有事务 ID 小于 min_trx_id 的事务都已经提交。
  • max_trx_id:在 Read View 创建时数据库中下一个将要分配的事务 ID。表示在 Read View 创建时,所有事务 ID 大于等于 max_trx_id 的事务是未来才会启动的事务。
  • m_ids:在 Read View 创建时,当前系统中所有活跃的事务 ID 列表。表示在 Read View 创建时,这些事务还未提交。
2.2 MVCC 的可见性规则

当一个事务试图读取某条记录时,InnoDB 会使用 MVCC 机制判断该记录的哪个版本对当前事务可见。判断过程如下:

  1. 自己的事务更新的记录总是可见

    • 如果当前事务对某条记录进行了更新(创建了新版本),那么这个版本对该事务总是可见的。
  2. 记录的 trx_id 小于 min_trx_id

    • 如果记录的 trx_id 小于 min_trx_id,说明这个版本的记录是在创建 Read View 之前的某个事务中生成的,且该事务已经提交。
    • 因此,这个版本的记录对当前事务是可见的。
  3. 记录的 trx_id 大于等于 max_trx_id

    • 如果记录的 trx_id 大于等于 max_trx_id,说明这个版本的记录是在创建 Read View 之后的某个事务中生成的(这些事务甚至可能还未开始)。
    • 因此,这个版本的记录对当前事务不可见。
  4. 记录的 trx_idmin_trx_idmax_trx_id 之间

    • 如果记录的 trx_id 介于 min_trx_idmax_trx_id 之间,需要进一步检查 trx_id 是否在 m_ids 列表中:
      • m_ids 列表中:表示生成该版本的事务还没有提交,仍然是活跃的。这时,该版本对当前事务不可见,因为它还处于未提交状态。
      • 不在 m_ids 列表中:表示生成该版本的事务已经提交,所以这个版本对当前事务可见。

3. 举例说明

假设当前有三个事务:

  • 事务 A(trx_id = 10):已提交。
  • 事务 B(trx_id = 15):未提交,仍在进行中。
  • 事务 C(trx_id = 20):未提交,仍在进行中。

假设当前有一个事务 D 正在运行,它的 trx_id 是 25。事务 D 创建了一个 Read View,假设在创建时系统的下一个事务 ID 为 30。

此时 Read View 的属性值为:

  • min_trx_id = 15(未提交的事务中最小的 ID)。
  • max_trx_id = 30(下一个将要分配的事务 ID)。
  • m_ids = [15, 20](未提交的事务列表)。

现在,事务 D 要读取某条记录,假设该记录的不同版本的 trx_id 分别是 10(旧版本)和 20(新版本),我们来看哪些版本对事务 D 可见:

  • 版本 1(trx_id = 10)
    • 10 < min_trx_id,这个版本的记录是在事务 D 的 Read View 创建之前已经提交的,因此对事务 D 可见。
  • 版本 2(trx_id = 20)
    • 20 在 min_trx_idmax_trx_id 之间,而且 20 在 m_ids 列表中,这意味着这个版本是由仍然活跃的事务 C 创建的,且未提交。
    • 因此,这个版本的记录对事务 D 不可见。

4. MVCC 的优点

  • 高并发性能:MVCC 允许读写操作并发进行,读操作不会阻塞写操作,写操作也不会阻塞读操作。
  • 一致性读取:通过 Read View,MVCC 确保每个事务读取到的都是一致的数据快照,而不会受到其他事务未提交修改的影响。
  • 无锁读:MVCC 实现了大多数情况下的无锁读操作,提高了数据库的整体性能。

5. MVCC 的局限性

  • 空间开销:由于需要保留旧版本数据,因此 MVCC 会增加数据存储的空间开销。
  • 垃圾数据清理:随着数据的不断更新和删除,版本链会变长,MySQL 需要定期清理不再需要的旧版本数据,这通常由后台线程完成。

6. 总结

MVCC 是 MySQL InnoDB 存储引擎用来处理并发事务的一种重要机制。通过版本链和 Read View 的机制,MVCC 能够高效地处理多个事务的并发读写操作,确保数据的一致性和系统的高性能。了解 MVCC 的工作原理,对于优化 MySQL 性能和解决并发问题至关重要。

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

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

相关文章

C#MVC返回DataTable到前端展示。

很久没写博客了&#xff0c;闭关太久&#xff0c;失踪人口回归&#xff0c;给诸位道友整点绝活。 交代下背景&#xff1a;要做一个行转列的汇总统计&#xff0c;而且&#xff0c;由于是行转列&#xff0c;列的数量不固定&#xff0c;所以&#xff0c;没法使用正常的SqlSugar框…

C++入门基础知识13

C 的关键字&#xff08;接上一篇博文&#xff09;&#xff01;&#xff01; 10. const_cast用法&#xff1a; 该运算符用来修改类型的 const 或 volatile 属性。除了 const 或 volatile 修饰之外&#xff0c; type_id 和 expression 的类型是一样的。常量指针被转化成非常量指针…

催收业务怎么提高接通率

提高催收呼叫业务的接通率是一个综合性的任务&#xff0c;需要从多个方面进行优化。以下是一些具体的策略和建议&#xff1a; 一、优化呼叫时间与频次 1. 选择合适的呼叫时间&#xff1a;通过分析目标客户的活跃时段&#xff0c;选择他们最可能接听电话的时间进行呼叫…

iOS Object-C 创建类别(Category) 与使用

有时候使用系统给出类或者第三方的类,但是呢它们自带的属性和方法又太少,不够我们的业务使用,这时候就需要给“系统的类或者第三方类”创建一个类别(Category),把自己的想添加的属性和方法写进来. Category模式用于向已经存在的类添加方法从而达到扩展已有类的目的 一:创建Ca…

零碳工厂:我国工业转型升级的绿色引擎

面对全球气候变化的严峻挑战&#xff0c;我国提出了碳达峰和碳中和的宏伟目标。零碳工厂作为工业领域实现这一目标的重要途径&#xff0c;正成为推动我国工业转型升级的绿色引擎。本文将提供一站式零碳工厂服务指南&#xff0c;帮助企业迈向零碳排放&#xff0c;共同构建绿色低…

零售企业做好人事管理并不难!智能化人事管理平台解决企业三大痛点!

在零售行业的激烈竞争中&#xff0c;优秀的人事管理策略是企业成功的关键。然而&#xff0c;传统的人事管理模式常常面临人员分散、流程繁琐、跨部门协作困难等挑战。为了应对这些问题&#xff0c;一站式人事管理平台的出现&#xff0c;为企业提供了数字化的解决方案。本文将探…

[论文泛读]zkLLM: Zero Knowledge Proofs for Large Language models

文章目录 介绍实验数据实验数据1实验数据2实验数据3 介绍 这篇文章发在CCS2024&#xff0c;CCS是密码学领域的顶会。作者是来自加拿大的University of Waterloo。文章对大语言模型像GPT和LLM等大语言模型实现了零知识可验证执行&#xff0c;但不涉及零知识可验证训练。个人觉得…

PAT--1124.最近的斐波那契数

题目描述 算法分析 找到把n夹在中间的两个斐波那契数列的数字&#xff0c;比如输入的数字9&#xff0c;你需要找到数字8和13&#xff0c;然后再输出差值绝对值较小的那个数字&#xff0c;如果一样&#xff0c;输出较小的数字 完整代码 #include<iostream> using names…

npm install pnpm -g 报错的解决方法

npm install pnpm -g 报错的解决方法 npm error code ETIMEDOUT npm error errno ETIMEDOUT npm error network request to https://registry.npmjs.org/pnpm failed, reason: npm error network This is a problem related to network connectivity. npm error network In mo…

三防加固平板电脑定制:现代工业环境的最佳选择

在数字化转型的浪潮中&#xff0c;工业领域正经历着前所未有的变革。智能设备的引入&#xff0c;尤其是定制化的三防加固平板电脑&#xff0c;正在成为现代工业环境中的关键工具。这些设备不仅能够承受严苛的工作条件&#xff0c;还能提供高度定制化的功能&#xff0c;以满足特…

萌啦数据使用体验,萌啦数据ozon体验如何

在跨境电商的浩瀚星海中&#xff0c;Ozon作为俄罗斯及独联体地区领先的电商平台&#xff0c;正以其独特的魅力和无限潜力吸引着全球卖家的目光。而在这片蓝海中航行&#xff0c;精准的数据分析与洞察无疑是每位船长手中的罗盘。今天&#xff0c;我们就来深入探讨一款备受好评的…

刷题技巧:双指针法的核心思想总结+例题整合+力扣接雨水双指针c++实现

双指针法的核心思想是通过同时操作两个指针来遍历数据结构&#xff0c;通常是数组或链表&#xff0c;以达到优化算法性能的目的。具体来说&#xff0c;双指针法能够减少时间复杂度、空间复杂度&#xff0c;或者简化逻辑结构。以下是双指针法的几个核心思想&#xff1a; ps 下面…

rem、em 和 px、inherit 加案例

一、rem、em 和 px 是三种常用的 CSS 长度单位&#xff0c;每种单位在不同的场景下有不同的应用和效果。以下是它们的区别&#xff1a; 以下是它们的区别&#xff1a; px (像素) 定义: px 是相对单位&#xff0c;表示屏幕上的一个物理像素点。它是一个固定的单位&#xff0c;…

手机电量消耗分析工具 Battery Historian 指南

阅读五分钟&#xff0c;每日十点&#xff0c;和您一起终身学习&#xff0c;这里是程序员Android 本篇文章主要介绍 Android 开发中 电量 的部分知识点&#xff0c;通过阅读本篇文章&#xff0c;您将收获以下内容: 一、安装Battery Historian二、收集Batterystats 数据三、使用B…

YOLO好像也没那么难?

“学YOLO的念头是想整个游戏外挂&#xff01;” 目录 基本原理 模型推理 IOU交并比 NMS非极大值抑制 模型训练 损失函数LOSS 代码实现 YOLO学习渠道 基本原理 模型推理 学习一个新的神经网络结构&#xff0c;作者认为整明白输入和输出是怎么回事就OK了&#xff0c;至于…

平安城市/雪亮工程现状及需求分析:EasyCVR视频汇聚平台助力雪亮工程项目建设

一、背景现状 经过近几年的努力&#xff0c;平安城市雪亮工程建设取得了显著的成绩&#xff0c;完成了前端高清视频点位和高清卡口系统建设&#xff0c;建成了&#xff08;视频监控类&#xff09;、&#xff08;卡口类&#xff09;和&#xff08;应用类&#xff09;的平台。这…

Linux笔记 --- 目录检索

基本概念 Linux中的目录与windows的文件夹相似但是概念大相径庭&#xff0c;windows中子文件一定不会比母文件夹大&#xff0c;但在Linux目录中是可以实现的&#xff0c;目录是一种文件索引表&#xff0c;下图是分区和目录的关系 Linux中目录是一组由文件名和索引号组成的索引表…

JavaScript基础(33)_鼠标滚轮滚动事件、键盘事件

鼠标滚轮滚动事件&#xff1a;onwheel 获取鼠标滚轮滚动的方向&#xff1a;wheelDelta 比如&#xff1a;向上滚动&#xff1a;109 &#xff08;所有正值都是向上&#xff09; 向下滚动&#xff1a;-109&#xff08;所有负值都是向下&#xff09; 注意&#xff1a;当…

技术分享:从崩溃边缘到问题解决 —— SSL证书兼容性问题的实战经历

引言 作为一名开发者&#xff0c;我们经常会遇到一些令人头疼的技术难题。有时候&#xff0c;这些问题看似简单却异常棘手&#xff0c;让人几乎要放弃。今天&#xff0c;我想分享一次特别的经历&#xff0c;它始于一系列的调试失败&#xff0c;最终却在不经意间找到了解决方案…

单片机几种通信协议(2)

SPI通信 相比于IIC协议&#xff0c;SPI通信速度更快&#xff0c;设计更为简单&#xff0c;功能并没有IIC那么多&#xff0c;学习起来比IIC简单许多 两条通信线&#xff0c;MISO,MOSI&#xff0c;全双工通信 理解SPI通信的核心