MySQL InnoDB 之 多版本并发控制(MVCC)

多版本并发控制(MVCC,Multi-Version Concurrency Control)是数据库管理系统中用于提供高并发性和在事务处理中实现隔离级别的一种技术。MVCC 允许系统在不完全锁定数据库资源的情况下,处理多个并发事务,从而提高了数据库的吞吐量和用户的响应速度。这是通过为每个读取操作创建数据的一个快照来实现的,使得事务可以访问数据的特定版本,而不是最新数据。

MVCC 的工作原理

MVCC 的核心是为数据库中的每个项维护多个版本。每个事务操作数据时,都会根据其隔离级别看到一个一致的快照版本,这意味着:

  • 读操作 不会阻塞写操作,因为它们可以访问到数据的旧版本。
  • 写操作 也不会阻塞读操作,因为新的数据修改会创建新的数据版本,而不是直接覆盖旧数据。

这样,不同的事务就可以同时进行读写操作,而不会互相干扰。

MVCC 如何处理事务

在 MVCC 中,每个事务都有一个唯一的时间戳(或事务ID),这个时间戳用于确定事务的执行顺序以及它应该看到的数据版本。当事务读取数据时,它会看到在该事务开始之前最后提交的数据版本。当事务更新数据时,它会创建数据的新版本,而不是覆盖现有数据,同时保留旧版本的数据以便其他事务访问。

由于我目前无法直接创建和显示图形或图片,我将以伪代码和描述的形式帮助你理解多版本并发控制(MVCC)的工作流程。你可以根据下面的描述,使用流程图软件或绘图工具来绘制流程图。

开始
|
|----> 事务开始
|        | (为事务分配唯一时间戳)
|        
|----> 读取操作
|        |----> 查询特定时间戳之前的最新数据版本
|        |        |
|        |        |----> 返回数据
|
|----> 写入操作
|        |----> 生成数据的新版本
|        |        | (带有当前事务的时间戳)
|        |        
|        |----> 写操作不阻塞读操作
|                 | (读者可以访问旧版本数据)
|
|----> 事务提交/回滚|----> 提交:使数据的新版本可用|        |----> 回滚:放弃数据的新版本||----> 启动垃圾回收| (清理不再需要的旧数据版本)结束

在这里插入图片描述

MVCC 工作流程解析:

  1. 事务开始:每个新事务都会被分配一个唯一的时间戳或事务ID。

  2. 读取操作

    • 当事务请求读取数据时,系统会查找该事务时间戳之前的数据版本,确保事务可以看到一个一致的数据快照。
  3. 写入操作

    • 写入操作会生成数据的新版本,并将其标记为由当前事务创建。这样,直到事务提交之前,其他事务是看不到这个新版本的。
    • 由于每个版本的数据都是独立的,因此写操作不会阻塞读操作,读事务仍然可以访问旧版本的数据。
  4. 事务提交/回滚

    • 如果事务成功提交,数据的新版本将变得对其他事务可见。
    • 如果事务回滚,则创建的数据新版本将被丢弃。
    • 随后,系统可能会触发垃圾回收过程,清理那些不再被任何事务所需的旧数据版本。

这个流程概括了 MVCC 在处理读取和写入操作时如何允许多个事务并发执行,同时保持数据的一致性和隔离性。希望这能帮助你理解 MVCC 的基本工作机制!

MVCC 与事务隔离级别

MVCC 支持 SQL 标准定义的不同事务隔离级别,包括:

  • 读未提交(Read Uncommitted):最低级别,事务可以看到其他未提交事务的更改。MVCC 通常不用于实现这个级别,因为它允许“脏读”。
  • 读已提交(Read Committed):保证事务只能看到已经提交的更改。在 MVCC 中,事务开始时所看到的数据快照反映了那一刻所有已提交的更改。
  • 可重复读(Repeatable Read):保证在事务内部执行的所有读取操作都能看到相同的数据快照。在 MVCC 中,这意味着事务在开始时获得的数据快照在事务结束前不会改变。
  • 串行化(Serializable):最高级别,通过加锁或使用乐观并发控制来保证事务的串行执行,避免幻读。MVCC 实现串行化通常需要额外的机制,如检测到潜在的冲突时重试事务。

核心模块

多版本并发控制(MVCC)是一个复杂且功能强大的机制,广泛应用于各种数据库系统中以提高并发性和性能。除了基本概念和工作流程外,还有一些更深入的知识点和高级主题值得探索:

1. 快照隔离与实现细节

  • 快照隔离(Snapshot Isolation):MVCC 的关键特性之一是提供了快照隔离级别,它允许事务看到数据库在特定时间点的一致状态快照。不同的数据库系统可能有不同的实现机制来保证快照的一致性和效率。
  • 可见性规则:数据库如何决定一个数据版本是否对某个事务可见是 MVCC 实现的核心。这通常涉及到事务ID和数据版本的时间戳比较。

2. 垃圾回收(Garbage Collection)

  • 版本清理:随着时间的推移,数据库中会积累许多不再被任何事务访问的旧数据版本。数据库需要定期清理这些版本以释放空间,这个过程称为垃圾回收。
  • 清理策略:不同的数据库系统可能采用不同的策略来进行垃圾回收,比如定期清理、惰性清理或在后台运行的清理进程。

3. 优化和挑战

  • 写放大(Write Amplification):MVCC 通过创建数据的新版本来避免写操作直接覆盖旧数据,这可能导致写放大现象,即实际写入的数据量远大于应用程序请求的数据量。
  • 读性能:虽然 MVCC 提高了并发性,但是在处理大量并发读取时,确定数据版本的可见性可能会导致性能开销。
  • 隔离级别的实现:不同的数据库如何实现 SQL 标准的各种隔离级别,以及这些实现对性能和一致性的影响,是 MVCC 中的一个重要话题。

4. 在不同数据库系统中的实现

  • PostgreSQL:使用事务ID进行版本控制,每行数据都包含创建和失效的事务ID,用于决定数据的可见性。
  • MySQL/InnoDB:InnoDB 通过在每行记录中维护额外的系统版本号(用于快照读)和事务版本号(用于当前读),来实现 MVCC。
  • Oracle:使用撤销段(Undo Segments)来存储旧数据版本,以支持“回滚”操作和提供读一致性的快照。

5. 并发控制与性能优化

  • 锁定策略与MVCC:虽然MVCC减少了锁的需求,但在某些情况下,如更新和删除操作,仍然需要适当的锁定机制以保证数据的一致性。
  • 索引维护:MVCC对索引的影响及如何高效地维护索引结构,尤其是在高并发环境中。

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

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

相关文章

计算机网络:物理层 - 信道复用

计算机网络:物理层 - 信道复用 频分复用时分复用统计时分复用波分复用码分复用 计算机网络中,用户之间通过信道进行通信,但是信道是有限的,想要提高网络的效率,就需要提高信道的利用效率。因此计算机网络中普遍采用信道…

循序渐进丨MogDB 对 Oracle DBLink兼容性增强

本特性自 MogDB 5.0.0版本开始引入,支持 Oracle DBLink语法,可以使用符号访问 Oracle 数据库中的表。 示 例 01 环境准备 MogDB 环境 已安装 MogDB 数据库。已安装oracle_fdw插件,具体安装方法参见oracle_fdw安装文档https://docs.mogdb.io/…

【博弈论3——二人博弈的纳什均衡】

1.俾斯麦海之战 2. 零和博弈的定义 零和博弈(Zero-Sum Game)是一种博弈论的基本概念,指的是在博弈过程中,博弈参与者之间的收益和损失之和总是一个常数,特别是总和为零。即博弈一方的收益必然等于另一方的损失&#x…

软考 - 系统架构设计师 - 关系模型的完整性规则

前言 关系模型的完整性规则是一组用于确保关系数据库中数据的完整性和一致性的规则。这些规则定义了在关系数据库中如何存储、更新和查询数据,以保证数据的准确性和一致性。 详情 关系模型的完整性规则主要包括以下三类: 实体完整性规则 这是确保每个…

【3D目标检测】Det3d—SE-SSD模型训练(前篇):KITTI数据集训练

SE-SSD模型训练 1 基于Det3d搭建SE-SSD环境2 自定义数据准备2.1 自定义数据集标注2.2 训练数据生成2.3 数据集分割 3 训练KITTI数据集3.1 数据准备3.2 配置修改3.3 模型训练 1 基于Det3d搭建SE-SSD环境 Det3D环境搭建参考:【3D目标检测】环境搭建(OpenP…

企业交换组网之VLAN

1. 企业内网有哪些安全隐患? 2. VLAN如何进行业务隔离?二层VLAN交换 3. 思科华为双厂商VLAN部署区别; --- VLAN - 虚拟局域网 --- 虚拟局域网:通过交换机连接的网络 - 把终端连接在一起 实现内网互通 共享文件夹&#xf…

GIMP - GNU 图像处理程序 - 中文版

GIMP - GNU 图像处理程序 - 中文版 1. Edit -> Preferences -> Interface2. Chinese [zh_CN]3. 重启 GIMP 即可References 1. Edit -> Preferences -> Interface 2. Chinese [zh_CN] 3. 重启 GIMP 即可 References [1] Yongqiang Cheng, https://yongqiang.blog.…

HTML块级元素和内联元素(头部和布局)

目录 1.HTML块级和内联标签: 1.块级元素: 2.内联元素: 3.元素嵌套: 4.元素转换: 示例如下: 2.内联框架: 前言: 示例如下: 3.布局: 4.头部标签: 前言: 说明&…

「MySQL」索引事务

🎇个人主页:Ice_Sugar_7 🎇所属专栏:数据库 🎇欢迎点赞收藏加关注哦! 索引&事务 🍉索引🍌特点🍌通过 SQL 操作索引🍌底层数据结构 🍉事务&…

芒果YOLOv8改进130:Neck篇,即插即用,CCFM重构跨尺度特征融合模块,构建CCFM模块,助力小目标检测涨点

芒果专栏 基于 CCFM 的改进结构,改进源码教程 | 详情如下🥇 💡本博客 改进源代码改进 适用于 YOLOv8 按步骤操作运行改进后的代码即可 即插即用 结构。博客 包括改进所需的 核心结构代码 文件 YOLOv8改进专栏完整目录链接:👉 芒果YOLOv8深度改进教程 | 🔥 订阅一个…

微服务(基础篇-006-Docker安装-CentOS7)

目录 05-初识Docker-Docker的安装_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p46&spm_id_frompageDriver&vd_source60a35a11f813c6dff0b76089e5e138cc 0.安装Docker 1.CentOS安装Docker 1.1.卸载(可选) 1.2.安装dock…

UE5启用SteamOSS流程

一、安装OnlineSubsystemSteam插件 1、在UE里安装OnlineSubsystemSteam 2、设置默认开始地图 3、设置DefaultEngine.ini文件: 打开项目根目录/Config/DefaultEngine.ini文件 打开官网的配置说明 复制并粘贴到该文件中 4、设置运行模式 5、测试 确保Steam平台已…

electron打包桌面版.exe之vue项目踩坑(vue3+electron 解决打包后首页打开空白,打包后路由不跳转及请求不到后端数据等问题)

vue项目https://www.qingplus.cn/components-web/index打包桌面版问题集合 一、静态资源加载问题 npm run electron_dev桌面版运行后页面空白,内容未加载。 填坑: 打包配置要用相对路径 vite.config.ts文件中的base要改成./,之前加了项目…

postcss安装和使用(详细)

1,安装postcss: 在此之前需要安装有node.js 第一步 命令:cnpm install postcss-cli -g 第二步 命令:cnpm install postcss –g 推荐内容 2,下载autoprefixer插件,并创建postcss.config.js文件并写入配置代码 autoprefixer插件…

习题2-5 求平方根序列前N项和

本题要求编写程序,计算平方根序列 的前N项之和。可包含头文件math.h,并调用sqrt函数求平方根。 输入格式: 输入在一行中给出一个正整数N。 输出格式: 在一行中按照“sum S”的格式输出部分和的值S,精确到小数点后两位。题目保证计算结果不…

西南交大swjtu算法实验3.3|穷举法

1.实验目的 通过具体例子学习排列这种典型的穷举算法的求解过程以及程序框架,分析其算法的求解过程,以及如何设计穷举法解决实际问题。通过本实验,理解穷举法的特点以及实际应用中的局限性。 2.实验任务 有n (n>1)个任务需要…

HarmonyOS 应用开发之FA模型与Stage模型应用组件

应用配置文件概述(FA模型) 每个应用项目必须在项目的代码目录下加入配置文件,这些配置文件会向编译工具、操作系统和应用市场提供描述应用的基本信息。 应用配置文件需申明以下内容: 应用的软件Bundle名称,应用的开发…

使用Python实现对word的批量操作

Python在平时写写小工具真是方便快捷,Pyhon大法好。以下所有代码都是找了好多网上的大佬分享的代码按照自己的需求改的。 调用的库为Python-docx、win32com、PyPDF2、xlwings(操作excel)。 因为公司的任务要对上千个word文件进行批量操作&a…

JAVAEE之网络编程

1.网络编程 网络编程,指网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输)。 当然,我们只要满足进程不同就行; 所以即便是同一个主机,只要是不同进程&am…

【论文阅读】ELA: Efficient Local Attention for Deep Convolutional Neural Networks

(ELA)Efficient Local Attention for Deep Convolutional Neural Networks 论文链接:ELA: Efficient Local Attention for Deep Convolutional Neural Networks (arxiv.org) 作者:Wei Xu, Yi Wan 单位:兰州大学信息…