MySQL 中的 MVCC 是什么?

MySQL 中的 MVCC(Multi-Version Concurrency Control,多版本并发控制) 是一种用于实现高并发读写操作的机制,它通过维护数据的多个版本来解决读写冲突,从而在保证事务隔离性的同时,减少锁的使用,提升数据库的并发性能。


MVCC 的核心原理

  1. 数据版本化

    • 每当一个事务修改数据时,InnoDB 存储引擎不会直接覆盖原始数据,而是生成一个新版本的数据,并将旧版本保留在回滚段(Undo Log)中。
    • 每个数据行会隐式添加三个字段:
      • DB_TRX_ID:记录最后修改该行的事务 ID。
      • DB_ROLL_PTR:指向回滚段中旧版本数据的指针(形成一个版本链)。
      • DB_ROW_ID:隐式自增主键(如果表没有显式主键)。
  2. 一致性视图(Read View)

    • 当事务开始时,InnoDB 会生成一个一致性视图(Read View),记录当前所有活跃事务的最小 ID(up_limit_id)和最大 ID(low_limit_id)。
    • 事务在查询数据时,会通过 Read View 判断某个数据版本是否对当前事务可见:
      • 如果数据的 DB_TRX_ID < up_limit_id(即修改该数据的事务已提交),则可见。
      • 如果 DB_TRX_ID >= low_limit_id(即修改该数据的事务是当前事务之后启动的),则不可见。
      • 如果 DB_TRX_ID[up_limit_id, low_limit_id) 之间,则需进一步判断该事务是否已提交。
  3. 事务隔离级别的实现

    • READ COMMITTED(RC):每个查询都会生成新的 Read View,因此可能看到其他事务已提交的修改。
    • REPEATABLE READ(RR):事务内所有查询共享同一个 Read View,因此多次查询结果一致(可重复读)。

MVCC 解决的核心问题

  1. 读写不阻塞

    • 写操作(如 UPDATEDELETE)会生成新版本数据,读操作无需等待写锁释放即可读取旧版本数据,从而避免读写冲突。
  2. 减少锁竞争

    • READ COMMITTEDREPEATABLE READ 隔离级别下,MVCC 大幅降低了对共享锁(S Lock)和排他锁(X Lock)的需求,提升了并发性能。
  3. 实现事务隔离性

    • 通过版本链和 Read View 机制,确保事务只能看到已提交的数据或自己修改的数据,满足不同隔离级别的要求。

MVCC 的优点

  1. 高并发性能

    • 读写操作可以并发执行,无需频繁等待锁,显著提升了数据库的吞吐量。
  2. 降低死锁风险

    • 由于减少了锁的使用,事务之间因锁竞争而死锁的概率降低。
  3. 一致性的读操作

    • REPEATABLE READ 隔离级别下,事务可以多次读取同一数据,得到一致的结果(可重复读)。

MVCC 的局限性

  1. 版本链开销

    • 频繁的更新操作会导致版本链过长,增加内存和磁盘 I/O 开销。
  2. 长事务问题

    • 长事务会长时间持有旧版本数据,导致回滚段膨胀,影响查询性能(需遍历更长的版本链)。
  3. 仅支持特定隔离级别

    • SERIALIZABLE 隔离级别下,MVCC 会退化为锁机制,性能下降。

总结

MVCC 是 MySQL InnoDB 存储引擎的核心特性之一,它通过数据版本化和一致性视图机制,在保证事务隔离性的同时,实现了高并发的读写操作。尽管 MVCC 存在一些局限性(如版本链开销和长事务问题),但在大多数场景下,它仍然是提升数据库并发性能的关键技术。

我正在程序员刷题神器面试鸭上高效准备面试,9000+ 高频面试真题、800 万字优质题解,覆盖主流编程方向,跟我一起刷原题、过面试:点击进入

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

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

相关文章

【Python】让Selenium 像Beautifulsoup一样,用解析HTML 结构的方式提取元素!

我在使用selenium的find_element的方式去获取网页元素&#xff0c;一般通过xpath、css_selector、class_name的方式去获取元素的绝对位置。 但是有时候如果网页多了一些弹窗或者啥之类的&#xff0c;绝对位置会发生变化&#xff0c;使用xpath等方法&#xff0c;需要经常变动。…

使用xlwings将excel表中将无规律的文本型数字批量转化成真正的数字

之前我写了一篇文章excel表中将无规律的文本型数字批量转化成真正的数字-CSDN博客 是使用excel自带的操作&#xff0c;相对繁琐。 今天使用xlwings操作&#xff0c;表格如下&#xff08;有真正的数字&#xff0c;也有文本型数字&#xff0c;混在在一起&#xff09;&#xff1…

ICML 2025录取率公布,spotlight posters仅占2.6%

近日&#xff0c;ICML 2025公布了论文录用结果。本次大会共收到 12,107篇有效论文投稿&#xff0c;比去年增加了28%&#xff0c;今年录取论文3,260篇&#xff0c;录取率为 26.9%。其中仅有313篇被列为“焦点海报”&#xff08;即所有投稿中排名前2.6%的论文&#xff09;&#x…

全局网络:重构数字时代的连接范式

从局部到全局 —— 网络架构的范式革命 在全球化与数字化深度融合的今天&#xff0c;传统网络架构的 “碎片化” 问题日益凸显&#xff1a;跨地域数据流通低效、设备互联孤岛化、安全策略难以统一。 全局网络作为一种突破地域与技术边界的新型网络架构&#xff0c;正成为企业…

SpringAI实现AI应用-内置顾问

SpringAI实战链接 1.SpringAl实现AI应用-快速搭建-CSDN博客 2.SpringAI实现AI应用-搭建知识库-CSDN博客 3.SpringAI实现AI应用-内置顾问-CSDN博客 4.SpringAI实现AI应用-使用redis持久化聊天记忆-CSDN博客 5.SpringAI实现AI应用-自定义顾问&#xff08;Advisor&#xff09…

Nginx核心原理以及案例分析(AI)

一、Nginx核心原理分析 1. ‌事件驱动与非阻塞模型‌ ‌Epoll异步机制‌&#xff1a;基于Linux的epoll模型实现异步非阻塞I/O处理&#xff0c;单线程可高效管理数万并发连接&#xff0c;避免传统select模型的轮询性能瓶颈。‌多进程架构‌&#xff1a;采用Master-Worker模式&…

【Bug经验分享】SourceTree用户设置必须被修复/SSH 主机密钥未缓存(踩坑)

文章目录 配置错误问题原因配置错误问题解决主机密钥缓存问题原因主机密钥缓存问题解决 更多相关内容可查看 配置错误问题原因 电脑太卡&#xff0c;曾多次强制关机&#xff0c;在关机前没有关闭SourceTree&#xff0c;导致配置错误等问题 配置错误问题解决 方式一&#xff…

阿里云服务器-centos部署定时同步数据库数据-dbswitch

前言&#xff1a; 本文章介绍通过dbswitch工具实现2个mysql数据库之间实现自动同步数据。 应用场景&#xff1a;公司要求实现正式环境数据库数据自动冷备 dbswitch依赖环境&#xff1a;git ,maven,jdk 方式一&#xff1a; 不需要在服务器中安装git和maven&#xff0c;直接用…

windows10 环境下通过huggingface_hub下载huggingface社区模型

项目场景&#xff1a; 有一些模型需要在huggingface下载&#xff0c;因为国内限制&#xff0c;一般无法访问huggingface网站进行下载。然而&#xff0c;可以通过国内的镜像下载。网上大部分都是在linux系统下&#xff0c;通过huggingface提供的指令下载。本文针对采用python脚…

C++之异常

目录 前言 一、什么是异常 二、C中的异常 2.1 C语言中的异常处理 2.2 C中的异常处理 2.3 异常的抛出与捕获 2.4 栈展开 2.5 查找匹配的处理代码 2.6 异常重新抛出 2.7 异常安全问题 2.8 异常规范 2.9 标准库的异常 前言 在之前我们已经学习了C中不少知识了&#xff0c;但是其中…

$在R语言中的作用

在 R 语言中&#xff0c;$ 是一个非常重要的操作符&#xff0c;主要用于访问对象的成员或组件。它的用途非常广泛&#xff0c;不仅限于数据框&#xff08;data frame&#xff09;&#xff0c;还可以用于列表&#xff08;list&#xff09;、环境&#xff08;environment&#xf…

设计一个分布式系统:要求全局消息顺序,如何使用Kafka实现?

一、高吞吐低延迟 Kafka 集群设计要点 1. 分区策略优化 // 计算合理分区数公式&#xff08;动态调整&#xff09; int numPartitions max(Tp, Tc) / min(Tp, Tc) // Tp生产者吞吐量 Tc消费者吞吐量建议初始按业务键&#xff08;如订单ID&#xff09;哈希分区单分区吞吐建议…

[dify]官方模板DeepResearch工作流学习笔记

一、功能 根据用户输入的主题进行多轮搜索并生成综合报告 1、流程分析 1.1 初始阶段 Start节点&#xff1a;接收用户输入的"depth"参数&#xff0c;决定搜索的深度/轮数 参数可以不填&#xff0c;不填的时候取默认值3 Create Array节点&#xff1a;根据depth参数…

hadoop中的序列化和反序列化(3)

3. Java的序列化 Java提供了内置的序列化机制&#xff0c;通过java.io.Serializable接口实现。 3.1 如何实现Java序列化 让类实现Serializable接口。 使用ObjectOutputStream进行序列化。 使用ObjectInputStream进行反序列化。 示例代码 序列化 java 复制 import jav…

6、CMake基础:流程控制

流程控制 1. 条件判断1.1 基本表达式1.2 逻辑判断1.3 比较基于数值的比较基于字符串的比较 1.4 文件操作1.5 其他 2. 循环2.1 foreach方法1方法2方法3方法4 2.2 while 在 CMake 的 CMakeLists.txt 中也可以进行流程控制&#xff0c;也就是说可以像写 shell 脚本那样进行条件判断…

【网络编程】二、UDP网络套接字编程详解

文章目录 前言Ⅰ. UDP服务端一、服务器创建流程二、创建套接字 -- socketsocket 属于什么类型的接口❓❓❓socket 是被谁调用的❓❓❓socket 底层做了什么❓❓❓和其函数返回值有没有什么关系❓❓❓ 三、绑定对应端口号、IP地址到套接字 -- bind四、数据的发送和接收 -- sendto…

准确--Notepad++ 实用的插件介绍

Notepad 提供了很多实用的插件&#xff0c;可以极大地提升编程和文本编辑的效率。以下是一些常用且有用的插件介绍&#xff1a; 1. NPP Export 功能&#xff1a;可以将打开的文件导出为 HTML 或 RTF 格式&#xff0c;方便生成漂亮的代码文档。用途&#xff1a;适合需要将代码…

[20250507] AI边缘计算开发板行业调研报告 ​​(2024年最新版)​

[20250507] AI边缘计算开发板行业调研报告 ​​(2024年最新版&#xff09;​ 一、行业背景​​ 随着物联网设备激增与AI模型轻量化&#xff0c;边缘计算成为AI落地核心场景。AI边缘计算开发板&#xff08;Edge AI Board&#xff09;作为硬件载体&#xff0c;需满足​​低延迟…

传输层协议 1.TCP 2.UDP

传输层协议 1.TCP 2.UDP TCP协议 回顾内容 传输层功能&#xff1a;定义应用层协议数据报文的端口号&#xff0c;流量控制对原始数据进行分段处理 传输层所提供服务 传输连接服务数据传输服务&#xff1a;流量控制、差错控制、序列控制 一、传输层的TCP协议 1.面向连接的…

LVGL -meter的应用

1 meter介绍 lv_meter 是 LVGL v8 引入的一种图形控件&#xff0c;用于创建仪表盘样式的用户界面元素&#xff0c;它可以模拟像速度表、电压表、温度表这类模拟表盘。它通过可视化刻度、指针、颜色弧线等来展示数值信息&#xff0c;是一种非常直观的数据展示控件。 1.1 核心特…