MySQL InnoDB引擎 MVCC

news2025/2/13 5:03:37

MVCC(Multi-Version Concurrency Control)即多版本并发控制,是 MySQL 的 InnoDB 存储引擎实现并发控制的一种重要技术。它在很多情况下避免了加锁操作,从而提高了数据库的并发性能。

一、原理

MVCC 的核心思想是通过保存数据在某个时间点的快照来实现并发控制。

在 MVCC 模型下,每个事务在启动时会看到一个数据库的一致性视图,该视图是由事务启动时数据库中所有已提交事务的状态决定的。

事务只能看到在其启动之前,已经提交的事务所做的更改,而看不到在其启动之后其他事务的未提交更改或新插入的数据,这样就避免了脏读、不可重复读等问题。

二、实现方式

InnoDB 存储引擎通过几个关键要素来实现 MVCC,包括隐藏列、回滚段(undo log)、事务 ID 和一致性视图(Read View)。

1. 隐藏列

InnoDB 为表中的每一行记录添加了三个隐藏列:

  • DB_TRX_ID:记录最近一次对该记录进行修改(INSERT、UPDATE)的事务 ID。当一个事务对记录进行插入操作时,会将自己的事务 ID 赋值给该记录的 DB_TRX_ID 列。

  • DB_ROLL_PTR:回滚指针,指向该记录的上一个版本所在的回滚段(undo log)。当对记录进行修改时,会将修改前的记录版本信息存储在回滚段中,并通过 DB_ROLL_PTR 指针指向该版本。

  • DB_ROW_ID:如果表中没有定义主键且没有唯一的非空索引,InnoDB 会自动为表添加一个隐藏的自增主键 DB_ROW_ID

2. 回滚段(undo log)

回滚段用于存储记录的旧版本信息。当一个事务对记录进行修改时,会将修改前的记录版本信息存储在回滚段中,并通过 DB_ROLL_PTR 指针将当前记录与旧版本记录连接起来,形成一个版本链。通过版本链,我们可以找到记录在不同时间点的所有版本。

在 MySQL InnoDB 引擎中,回滚段(undo log)的合理配置对于数据库的性能、事务处理以及数据恢复等方面都至关重要。

关键配置参数

1. innodb_undo_logs

  • 作用:该参数用于设置 InnoDB 存储引擎中回滚段的数量。在 MySQL 5.6 及以后的版本中,默认值通常为 128 个。增加回滚段的数量可以提高并发事务处理能力,因为多个事务可以同时使用不同的回滚段,减少了回滚段的竞争。

  • 配置示例:若要将回滚段数量设置为 256,可以在 MySQL 配置文件(通常是 my.cnf 或 my.ini)中添加或修改如下配置:

[mysqld]
innodb_undo_logs = 256

2. innodb_undo_tablespaces

  • 作用:此参数用于指定回滚段所在的表空间数量。从 MySQL 5.6 开始,InnoDB 支持将回滚段存储在独立的表空间中,这样可以更好地管理回滚段的空间。设置多个回滚段表空间可以分散 I/O 负载,提高性能。

  • 配置示例:假设要将回滚段存储在 3 个独立的表空间中,可在配置文件中添加:

[mysqld]
innodb_undo_tablespaces = 3

3. innodb_max_undo_log_size

  • 作用:该参数限制了单个回滚段文件的最大大小。当回滚段文件达到这个大小后,InnoDB 会尝试回收不再使用的 undo log 空间。如果无法回收足够的空间,可能会导致事务等待或报错。

  • 配置示例:若要将单个回滚段文件的最大大小设置为 2GB,可以在配置文件中添加:

[mysqld]
innodb_max_undo_log_size = 2G

4. innodb_undo_log_truncate

  • 作用:这是一个布尔型参数,用于控制是否启用回滚段文件的截断功能。当设置为 ON 时,InnoDB 会在合适的时机自动截断回滚段文件,释放不再使用的空间。默认值为 OFF

  • 配置示例:若要启用回滚段文件截断功能,可在配置文件中添加:

[mysqld]
innodb_undo_log_truncate = ON

配置建议

  • 根据并发情况调整回滚段数量:如果数据库中有大量的并发事务,适当增加 innodb_undo_logs 的值可以减少回滚段的竞争,提高并发性能。但过多的回滚段也会增加系统管理的开销,需要根据实际情况进行权衡。

  • 使用独立的回滚段表空间:将回滚段存储在独立的表空间中(通过设置 innodb_undo_tablespaces)可以提高 I/O 性能,尤其是在高并发场景下。

  • 合理设置回滚段文件大小innodb_max_undo_log_size 的设置需要考虑数据库的事务大小和频率。如果事务较大或频繁,可适当增大该值;反之,则可以减小。

  • 启用回滚段文件截断功能:对于长期运行的数据库,启用 innodb_undo_log_truncate 可以有效地管理回滚段的空间,避免回滚段文件无限增长。

3. 事务 ID

每个事务在启动时会被分配一个唯一的事务 ID,事务 ID 是一个单调递增的整数。通过比较事务 ID 的大小,我们可以判断事务的先后顺序。

4. 一致性视图(Read View)

一致性视图是 MVCC 的关键机制之一,它是一个事务在启动时生成的,用于判断当前事务可以看到哪些版本的记录。一致性视图中包含了以下几个重要信息:

  • 低水位(trx_ids_min):当前所有活跃事务中最小的事务 ID。

  • 高水位(trx_ids_max):生成该视图时系统分配的下一个事务 ID。

  • 活跃事务列表(trx_ids):生成该视图时所有活跃事务的事务 ID 列表。

5. 工作流程

MVCC 的工作流程主要涉及读操作和写操作:

读操作

当一个事务要读取某条记录时,会根据记录的 DB_TRX_ID 和一致性视图的信息来判断是否可以看到该记录的当前版本。具体规则如下:

  • 如果 DB_TRX_ID < trx_ids_min,即最近修改数据的事务 ID 小于 当前所有活跃事务的最小事务 ID,表示该记录的修改事务在当前事务启动之前已经提交,当前事务可以看到该记录的当前版本。

  • 如果 DB_TRX_ID >= trx_ids_max,即最近修改数据的事务 ID 大于等于 生成该视图时系统分配的下一个事务 ID,表示该记录的修改事务在当前事务启动之后才启动,当前事务看不到该记录的当前版本,需要通过 DB_ROLL_PTR 指针查找旧版本。

  • 如果 trx_ids_min <= DB_TRX_ID < trx_ids_max,需要判断 DB_TRX_ID 是否在活跃事务列表 trx_ids 中:

    • 如果在列表中,表示该记录的修改事务在当前事务启动时还未提交,当前事务看不到该记录的当前版本,需要通过 DB_ROLL_PTR 指针查找旧版本。

    • 如果不在列表中,表示该记录的修改事务在当前事务启动时已经提交,当前事务可以看到该记录的当前版本。

写操作

当一个事务要对某条记录进行修改时,会将修改前的记录版本信息存储在回滚段中,并更新记录的 DB_TRX_ID 和 DB_ROLL_PTR 列。具体步骤如下:

  1. 将修改前的记录版本信息复制到回滚段中。

  2. 更新记录的 DB_TRX_ID 列,将其设置为当前事务的事务 ID。

  3. 更新记录的 DB_ROLL_PTR 指针,使其指向回滚段中存储的旧版本记录。

  4. 对记录进行实际的修改操作。

通过这种方式,写操作会创建一个新的数据版本,而不会影响其他事务对旧版本的读取。不同事务可以在不同的版本上进行操作,从而实现了读写操作的并发执行。

综上所述,MVCC 通过隐藏列、回滚段、事务 ID 和一致性视图等机制,实现了读写操作的并发执行,提高了数据库的并发性能,同时保证了数据的一致性。不同的事务隔离级别会影响一致性视图的生成和使用方式,从而实现不同程度的数据隔离。

三、对比

MVCC(多版本并发控制)和传统的锁机制都是数据库中用于实现并发控制的重要技术,它们各自具有独特的优缺点,以下是详细对比:

优点对比

MVCC
  • 高并发性能

    • MVCC 允许多个事务在不同版本的数据上进行读写操作,避免了大部分情况下的读写锁冲突。读操作可以直接读取数据的历史版本,无需等待写操作释放锁,写操作也不会阻塞读操作,从而显著提高了数据库的并发处理能力。例如,在一个高并发的电商系统中,大量用户同时进行商品信息的查询(读操作)和订单的创建(写操作),MVCC 可以让这些操作并行执行,减少用户的等待时间。

  • 实现事务隔离

    • 能够方便地实现不同的事务隔离级别,如读已提交(Read Committed)和可重复读(Repeatable Read)。通过一致性视图(Read View),事务可以看到特定时间点的数据快照,保证了数据的一致性和隔离性。在可重复读隔离级别下,一个事务在整个生命周期内多次读取同一数据时,会看到相同的结果,避免了不可重复读和部分幻读问题。

  • 减少死锁概率

    • 由于读操作通常不需要加锁,减少了锁的使用,从而降低了死锁发生的可能性。死锁是传统锁机制中常见的问题,当多个事务相互等待对方释放锁时,就会导致死锁的发生。MVCC 的使用使得事务之间的锁竞争减少,系统的稳定性得到提高。

传统锁机制
  • 强一致性保证

    • 传统锁机制可以提供严格的一致性保证,确保在同一时间只有一个事务可以访问或修改数据。在串行化隔离级别下,通过对数据加锁,保证了事务的串行执行,避免了任何并发问题,如脏读、不可重复读和幻读,适用于对数据一致性要求极高的场景,如金融交易系统。

  • 精确控制并发

    • 可以精确地控制事务对数据的访问权限,根据不同的业务需求选择不同类型的锁(如共享锁、排他锁)和加锁粒度(如行锁、表锁)。例如,在某些情况下,需要对整个表进行锁定以确保数据的完整性,传统锁机制可以很方便地实现这一点。

缺点对比

MVCC
  • 占用额外存储空间

    • 为了保存数据的多个版本,MVCC 需要使用回滚段(undo log)来存储旧版本信息,这会占用额外的磁盘空间。随着数据的不断更新和版本的增加,回滚段的空间开销会逐渐增大,需要进行定期的清理和管理。

  • 回滚段管理开销

    • 对回滚段的管理需要额外的系统资源和时间开销。包括回滚段的分配、回收以及过期版本的清理等操作,都会影响数据库的性能。如果回滚段管理不当,可能会导致性能下降或空间浪费。

  • 不支持完全序列化隔离

    • MVCC 不能完全实现序列化隔离级别,在某些情况下可能会出现幻读问题。虽然在可重复读隔离级别下可以避免大部分幻读,但在极端情况下,仍然可能需要使用额外的锁机制来解决幻读问题。

传统锁机制
  • 低并发性能

    • 传统锁机制会导致读写操作之间的锁竞争,当多个事务同时访问相同的数据时,会出现大量的锁等待现象,降低了数据库的并发性能。例如,一个写操作对数据加了排他锁,其他事务的读操作和写操作都需要等待该锁释放,从而导致系统响应时间变长。

  • 死锁风险高

    • 由于锁的使用,多个事务之间可能会形成循环等待锁的情况,从而导致死锁的发生。死锁的检测和处理需要额外的系统开销,并且会影响事务的正常执行,降低系统的可靠性。

  • 锁粒度选择困难

    • 选择合适的锁粒度是一个难题。如果锁粒度太粗(如表锁),会导致并发性能下降;如果锁粒度太细(如行锁),会增加锁的管理开销和死锁的风险。在实际应用中,需要根据具体的业务场景和数据访问模式来选择合适的锁粒度。

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

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

相关文章

Python的那些事第十八篇:框架与算法应用研究,人工智能与机器学习

人工智能与机器学习&#xff1a;框架与算法应用研究 摘要 本文深入探讨了人工智能与机器学习领域的核心框架和技术&#xff0c;包括TensorFlow、PyTorch和Scikit-learn库。文章首先介绍了TensorFlow和PyTorch的安装与配置方法&#xff0c;详细阐述了它们的基础概念&#xff0c…

java微服务常用技术

Spring Cloud Alibaba 1 系统架构演进 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。 1.1 单体架构 早期的软件系统通常是基于单体应用架构设计的,也就是将整个系统作为一个单一的、可执行的应用程序来构建和维护…

【Qt 常用控件】多元素控件(QListWidget、QTabelWidgt、QTreeWidget)

**View和**Widget的区别&#xff1f; **View的实现更底层&#xff0c;**Widget是基于**View封装实现的更易用的类型。 **View使用MVC结构 MVC是软件开发中 经典的 软件结构 组织形式&#xff0c;软件设计模式。 M&#xff08;model&#xff09;模型。管理应用程序的核心数据和…

解决VsCode的 Vetur 插件has no default export Vetur问题

文章目录 前言1.问题2. 原因3. 解决其他 前言 提示&#xff1a; 1.问题 Cannot find module ‘ant-design-vue’. Did you mean to set the ‘moduleResolution’ option to ‘node’, or to add aliases to the ‘paths’ option? Module ‘“/xxx/xxx/xxx/xxx/xxx/src/vie…

python制作自己的一款Markdowm格式消除工具

01 引言 在日常使用 Markdown 编写文档时&#xff0c;我们有时会需要将 Markdown 格式的文本转换为纯文本&#xff0c;去除其中的各种标记符号&#xff0c;如标题符号、列表符号、代码块标记等。手动去除这些标记不仅效率低下&#xff0c;还容易出错。本文将介绍如何使用 Pyt…

如何从头训练大语言模型: A simple technical report

今天来快速捋一下路线&#xff0c;写个简短的technical report&#xff0c;更多是原理介绍性的。按我个人理解&#xff0c;从最简单的部分开始&#xff0c;逐步过渡到最繁复的环节: 模型架构-> Pretrain -> Post-Train -> Infra -> 数据侧。再掺杂一些杂项&#xf…

gitlab无法登录问题

在我第一次安装gitlab的时候发现登录页面是 正常的页面应该是 这种情况的主要原因是不是第一次登录&#xff0c;所以我们要找到原先的密码 解决方式&#xff1a; [rootgitlab ~]# vim /etc/gitlab/initial_root_password# WARNING: This value is valid only in the followin…

食品饮料生产瓶颈?富唯智能协作机器人来 “破壁”

在食品和饮料行业的发展进程中&#xff0c;诸多生产瓶颈如重复性劳动负担、复杂环境作业难题、季节性产能波动等&#xff0c;长期制约着企业的高效运营与进一步发展。如今&#xff0c;富唯智能协作机器人的出现&#xff0c;为这些难题提供了完美的解决方案&#xff0c;正逐步改…

Python 实现 macOS 系统代理的设置

设置 SOCKS 代理 在 macOS 系统中&#xff0c;可以通过 networksetup 工具来设置 SOCKS 代理。以下是 Python 实现的方法&#xff1a; 使用 networksetup 设置 SOCKS 代理 import subprocessdef set_socks_proxy(server, port):"""设置 macOS 系统的 SOCKS 代理…

深度学习之神经网络框架搭建及模型优化

神经网络框架搭建及模型优化 目录 神经网络框架搭建及模型优化1 数据及配置1.1 配置1.2 数据1.3 函数导入1.4 数据函数1.5 数据打包 2 神经网络框架搭建2.1 框架确认2.2 函数搭建2.3 框架上传 3 模型优化3.1 函数理解3.2 训练模型和测试模型代码 4 最终代码测试4.1 SGD优化算法…

【设计模式】【行为型模式】命令模式(Command)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f4eb; 欢迎V&#xff1a; flzjcsg2&#xff0c;我们共同讨论Java深渊的奥秘 &#x1f…

C++模拟实现AVL树

目录 1.文章概括 2.AVL树概念 3.AVL树的性质 4.AVL树的插入 5.旋转控制 1.左单旋 2. 右单旋 3.左右双旋 4.右左双旋 6.全部代码 1.文章概括 本文适合理解平衡二叉树的读者阅读&#xff0c;因为AVL树是平衡二叉树的一种优化&#xff0c;其大部分实现逻辑与平衡二叉树是…

python卷积神经网络人脸识别示例实现详解

目录 一、准备 1&#xff09;使用pytorch 2&#xff09;安装pytorch 3&#xff09;准备训练和测试资源 二、卷积神经网络的基本结构 三、代码实现 1&#xff09;导入库 2&#xff09;数据预处理 3&#xff09;加载数据 4&#xff09;构建一个卷积神经网络 5&#xff0…

以Unity6.0为例,如何在Unity中开启DLSS功能

DLSS DLSS&#xff08;NVIDIA 深度学习超级采样&#xff09;&#xff1a;NVIDIA DLSS 是一套由 GeForce RTX™ Tensor Core 提供支持的神经渲染技术&#xff0c;可提高帧率&#xff0c;同时提供可与原生分辨率相媲美的清晰、高质量图像。目前最新突破DLSS 4 带来了新的多帧…

CSDN 大模型 笔记

AI 3大范式&#xff1a;计算 发发 交互 L1 生成代码 复制到IDEA &#xff08;22年12-23年6&#xff0c;7月份&#xff09; L2 部分自动编程 定义class 设计interface 让其填充实现 (23年7&#xff0c;8月份) L3 通用任务 CRUD (24年) L4 高度自动编程 通用领域专有任务&#xf…

Stability AI 联合 UIUC 提出单视图 3D 重建方法SPAR3D,可0.7秒完成重建并支持交互式用户编辑。

Stability AI 联合 UIUC 提出一种简单而有效的单视图 3D 重建方法 SPAR3D&#xff0c;这是一款最先进的 3D 重建器&#xff0c;可以从单视图图像重建高质量的 3D 网格。SPAR3D 的重建速度很快&#xff0c;只需 0.7 秒&#xff0c;并支持交互式用户编辑。 相关链接 论文&#xf…

网易易盾接入DeepSeek,数字内容安全“智”理能力全面升级

今年农历新年期间&#xff0c;全球AI领域再度掀起了一波革命性浪潮&#xff0c;国产通用大模型DeepSeek凭借其强大的多场景理解与内容生成能力迅速“出圈”&#xff0c;彻底改写全球人工智能产业的格局。 作为国内领先的数字内容风控服务商&#xff0c;网易易盾一直致力于探索…

自动驾驶---如何打造一款属于自己的自动驾驶系统

在笔者的专栏《自动驾驶Planning决策规划》中&#xff0c;主要讲解了行车的相关知识&#xff0c;从Routing&#xff0c;到Behavior Planning&#xff0c;再到Motion Planning&#xff0c;以及最后的Control&#xff0c;笔者都做了相关介绍&#xff0c;其中主要包括算法在量产上…

聚焦 AUTO TECH China 2025,共探汽车内外饰新未来Automotive Interiors

全球汽车产业蓬勃发展的大背景下&#xff0c;汽车内外饰作为汽车重要组成部分&#xff0c;其市场需求与技术创新不断推动着行业变革。2025年11月20日至22日&#xff0c;一场备受瞩目的行业盛会 ——AUTO TECH China 2025 广州国际汽车内外饰技术展览会将在广州保利世贸博览馆盛…

Moretl 增量文件采集工具

永久免费: <下载> <使用说明> 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架构 技术架构: Asp…