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

news2024/11/25 20:50:23

多版本并发控制(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.coloradmin.cn/o/1557489.html

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

相关文章

AcWing-木棍

167. 木棒 - AcWing题库 所需知识:dfs,剪枝 思路:首先,将木棍的长度从所有小木棍的最大值开始遍历,遇到的第一个能使所有的小木棍组合成长度相等的大木棍时,则为最优答案,如果想暴力做的话&am…

vscode初始化node项目

首先需要安装node环境,推荐直接使用nvm 安装node,方便切换node版本 1.npm init 初始化node项目 在命令行输入npm init指令 根据指令创建完成后会在当前目录下生成一个package.json文件,记住运行npm init执行的目录必须是一个空目录 2.创建…

YOLOv9改进策略 :主干优化 | ConvNeXtV2:适应自监督学习,让 CNN “再一次强大”?

💡💡💡本文改进内容:完全卷积掩码自编码器框架 ConvNeXt V2,它显著提高了纯convnet在各种识别基准上的性能,包括ImageNet分类,COCO目标检测和ADE20k分割。还提供了各种尺寸的预训练ConvNeXt v2模型,从而在ImageNet上具有76.7%精度的3.7M Atto model和88.9%精度的650…

PID算法控制5840-31ZY编码器直流减速电机旋转特定角度(一)

模块分析 在本工程中,使用stm32做主控芯片输出PWM波,TB6112做电源驱动带动5840-31ZY编码器直流减速电机旋转特定角度 有如下模块 TB6112驱动模块 TB6112是性能优于常见L298N的一款电机驱动芯片,体积更小效率更高发热少 其接线如图&#x…

手机真机连接USB调试adb不识别不显示和TCPIP连接问题

手机真机连接USB调试adb devices不显示设备和TCPIP连接 本文手机型号为NOVA 7 ,其他型号手机在开发人员模式打开等方式可能略有不同,需根据自己的手机型号修改。 文章目录 1. 打开和关闭开发者模式2. 真机USB连接调试adb不显示设备问题的若干解决方法3…

K8S中部署yaml文件(如Java项目)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

容器安全与防御(德迅蜂巢)

通过容器可以快速的运行应用、迁移应用、快速集成、快速部署、也提高了系统的资源利用率,因此现在越来越多的企业把应用上云,来达到快速上线应用、方便运维的目的。容器安全也逐渐地被重视起来,了解容器如何检测当前企业环境内容器环境是否安…

web练习仿小米页面

效果图&#xff1a; HTML代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document…

绿联 安装PDF工具

这是一个强大的本地托管的基于 Web 的 PDF 操作工具&#xff0c;使用 docker&#xff0c;允许您对 PDF 文件执行各种操作&#xff0c;例如拆分、合并、转换、重组、添加图像、旋转、压缩等。这个本地托管的 Web 应用程序最初是 100% ChatGPT 制作的应用程序&#xff0c;现已发展…

【ENSP】OSPF实现多区域之间的通信

多区域作用&#xff1a;减少路由条目&#xff0c;增加收敛时间 OSPF配置方法 ospf 1 router-id 1.1.1.1 #1为进程号&#xff0c;1.1.1.1唯一标识路由器are 0.0.0.0 #配置区域network 192.168.1.0 0.0.0.25…

专升本-云计算

被誉为第三次信息技术革命 什么是云计算&#xff1f; 云计算是一种商业的计算模式&#xff0c;它将任务分布在大量计算机构成的资源池上&#xff0c;用户可以按需通过网络存储空间&#xff0c;计算能力和信息等服务 云计算的产生和发展&#xff1a; 起源&#xff1a;上世纪6…

牛客NC153 信封嵌套问题【中等 动态规划,最长递增子序列 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/9bf77b5b018d4d24951c9a7edb40408f 相同的题目&#xff1a; https://www.lintcode.com/problem/602 思路 本质是求最长子序列问题envelopes 先按 w 升序排序&#xff0c;再按 h 降序 排序&#xff0c;只需考虑h…

IPv6-地址解析、NUD、DAD、NDP

IPv6-地址解析、NUD&#xff08;邻居不可达检测&#xff09;、DAD&#xff08;重复地址检测&#xff09;&#xff1a; ICMPv6的消息类型&#xff1a; ICMPv6消息回显&#xff0c;type在0~127之间的表示为差错消息&#xff1b;type值在128、129表示信息消息。 1、IPv6地址协议…

HCIP【GRE VPN、MGRE VPN与PPP验证综合实验】

目录 实验要求&#xff1a; 实验拓扑图&#xff1a; 实验思路&#xff1a; 实验步骤&#xff1a; 一、配IP地址 &#xff08;1&#xff09;配置所有设备接口的IP地址&#xff1a; &#xff08;2&#xff09;配置私网与公网接口的缺省路由使得公网可通&#xff1a; 二、P…

ChatGPT如何升级为GPT-4在国内

通过 WildCard 可以把ChatGPT升级为GPT-4 地址 1: 2155 Bailey Hill Rd 城市: Eugene 邮编: 97405 州: Oregon ChatGPT Plus/Team 一键升级&#xff0c;几分钟即可自动升级到 ChatGPT Plus。 选择我的邮箱账号符合要求 复制这个页面的链接即可 复制上面的link 到请在…

SpringCloud实用篇(二)——搭建eureka服务

搭建eureka服务 搭建EurekaServer 注册eureka自己本身 1.创建项目&#xff0c;引入spring-cloud-starter-neflix-eureka-server的依赖 <!--eureka服务端--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cl…

sectigo 单IP证书360元

IP数字证书使用了强大的加密功能&#xff0c;能够有效保护网站和用户数据在传输过程中的安全。由Sectigo颁发的各种数字证书兼容性高&#xff0c;可以支持几乎所有主流浏览器&#xff0c;在用户访问时不会出现“不安全”提示&#xff0c;Sectigo旗下的IP证书可以为只有公网IP地…

理解游戏服务器架构-逻辑底层架构

目录 前言 什么是逻辑底层架构 逻辑底层架构的职责 1&#xff09;Thread-线程 线程管理 线程通讯 线程安全锁机制 2&#xff09;Network-网络 网络模型 网络消息协议 断线重连 网络安全 防范重复消息 防范篡改消息内容 防范篡改内存数据 网络承载 3&#xff0…

OpenKylin安装Kafka

一、操作系统 openKylin 1.0.1 X86 二、下载安装包 # 安装依赖jdk sudo apt-get update sudo apt-get install default-jdk # 下载kafka mkdir -p /data/software/kafka wget https://archive.apache.org/dist/kafka/2.4.1/kafka_2.13-2.4.1.tgz三、解压安装 # 解压缩Kafka…

【自动装箱以及包装类的缓存】⭐️通过具体案例看下每种包装类的不同结果

目录 前言 一、自动装箱与拆箱&#xff08;以 Integer 包装类为例&#xff09; 二、再来看看几个示例 ​编辑三、Double ,Float 类型亦是如此吗&#xff1f; 前言 小伙伴们大家好&#xff0c;日常使用业务层方面的代码居多&#xff0c;但也不可忘了基本的一些代码格式以及原…