MySQL InnoDB引擎 MVCC

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.mzph.cn/news/895378.shtml

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

相关文章

vue纯静态实现 视频转GIF 功能(附源码)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、实现后的效果二、使用步骤1.引入库2.下载or复制出来js3. 前端实现 总结 前言 一天一个小demo 今天来一个vue纯静态实现 视频转GIF 功能 上一篇我们讲到了…

因果机器学习(CausalML)前沿创新思路

结合了传统因果推断与机器学习的因果机器学习是目前AI领域的前沿研究方向&#xff0c;其核心优势在于将因果逻辑融入数据驱动模型&#xff0c;从根本上解决了传统方法的缺陷。因此&#xff0c;它也是突破传统机器学习瓶颈的关键方向&#xff0c;不仅当下热度高&#xff0c;在未…

【CubeMX+STM32】SD卡 U盘文件系统 USB+FATFS

本篇&#xff0c;将使用CubeMXKeil, 创建一个 USBTF卡存储FatFS 的虚拟U盘读写工程。 目录 一、简述 二、CubeMX 配置 SDIO DMA FatFs USB 三、Keil 编辑代码 四、实验效果 串口助手&#xff0c;实现效果&#xff1a; U盘&#xff0c;识别效果&#xff1a; 一、简述 上…

docker nginx 配置文件详解

在平常的开发工作中&#xff0c;我们经常需要访问静态资源&#xff08;图片、HTML页面等&#xff09;、访问文件目录、部署项目时进行负载均衡等。那么我们就会使用到Nginx&#xff0c;nginx.conf 的配置至关重要。那么今天主要结合访问静态资源、负载均衡等总结下 nginx.conf …

解读 Flink Source 接口重构后的 KafkaSource

前言 Apache Kafka 和 Apache Flink 的结合&#xff0c;为构建实时流处理应用提供了一套强大的解决方案[1]。Kafka 作为高吞吐量、低延迟的分布式消息队列&#xff0c;负责数据的采集、缓冲和分发&#xff1b;而 Flink 则是功能强大的流处理引擎&#xff0c;负责对数据进行实时…

【推理llm论文精读】DeepSeek V3技术论文_精工见效果

先附上原始论文和效果对比https://arxiv.org/pdf/2412.19437 摘要 (Abstract) DeepSeek-V3是DeepSeek-AI团队推出的最新力作&#xff0c;一个强大的混合专家&#xff08;Mixture-of-Experts&#xff0c;MoE&#xff09;语言模型。它拥有671B的总参数量&#xff0c;但每个tok…

如何使用Java语言在Idea和Android中分别建立服务端和客户端实现局域网聊天

手把手教你用Java语言在Idea和Android中分别建立服务端和客户端实现局域网聊天 目录 文章目录 手把手教你用**Java**语言在**Idea**和**Android**中分别建立**服务端**和**客户端**实现局域网聊天**目录**[toc]**基本实现****问题分析****服务端**Idea:结构预览Server类代码解…

java韩顺平最新教程,Java工程师进阶

简介 HikariCP 是用于创建和管理连接&#xff0c;利用“池”的方式复用连接减少资源开销&#xff0c;和其他数据源一样&#xff0c;也具有连接数控制、连接可靠性测试、连接泄露控制、缓存语句等功能&#xff0c;另外&#xff0c;和 druid 一样&#xff0c;HikariCP 也支持监控…

如何在 IDE 里使用 DeepSeek?

近期&#xff0c;阿里云百炼平台重磅推出 DeepSeek-V3、DeepSeek-R1、DeepSeek-R1-Distill-Qwen-32B 等 6 款模型&#xff0c;进一步丰富其 AI 模型矩阵。与此同时&#xff0c;通义灵码也紧跟步伐&#xff0c;全新上线模型选择功能&#xff0c;支持基于百炼的 DeepSeek-V3 和 D…

网络安全技术复习总结

1|0第一章 概论 1.网络安全发展阶段包括四个阶段&#xff1a;通信安全、计算机安全、网络安全、网络空间安全。 2.2017年6月1日&#xff0c;我国第一部全面规范网络空间安全的基础性法律《中华人民共和国网络安全法》正式实施。 3.2021年 6月10日&#xff0c;《中华人民共和…

DedeBIZ系统审计小结

之前简单审计过DedeBIZ系统&#xff0c;网上还没有对这个系统的漏洞有过详尽的分析&#xff0c;于是重新审计并总结文章&#xff0c;记录下自己审计的过程。 https://github.com/DedeBIZ/DedeV6/archive/refs/tags/6.2.10.zip &#x1f4cc;DedeBIZ 系统并非基于 MVC 框架&…

业务开发 | 基础知识 | Maven 快速入门

Maven 快速入门 1.Maven 全面概述 Apache Maven 是一种软件项目管理和理解工具。基于项目对象模型的概念&#xff08;POM&#xff09;&#xff0c;Maven 可以从中央信息中管理项目的构建&#xff0c;报告和文档。 2.Maven 基本功能 因此实际上 Maven 的基本功能就是作为 Ja…

2.11 sqlite3数据库【数据库的相关操作指令、函数】

练习&#xff1a; 将 epoll 服务器 客户端拿来用 客户端&#xff1a;写一个界面&#xff0c;里面有注册登录 服务器&#xff1a;处理注册和登录逻辑&#xff0c;注册的话将注册的账号密码写入数据库&#xff0c;登录的话查询数据库中是否存在账号&#xff0c;并验证密码是否正确…

Python(十九)实现各大跨境船公司物流查询数据处理优化

一、前言 之前已经实现了常用 跨境物流船司 基础信息查询功能&#xff0c;如下所示 实现各大跨境船公司[COSCO/ZIM/MSK/MSC/ONE/PIL]的物流信息查询&#xff1a;https://blog.csdn.net/Makasa/article/details/145484999?spm1001.2014.3001.5501 然后本章在其基础上做了一些…

基于微信小程序的博物馆预约系统的设计与实现

hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生…

深度学习框架TensorFlow怎么用?

大家好呀&#xff0c;以下是使用 TensorFlow 的详细步骤&#xff0c;从安装到构建和训练模型&#xff1a; 一、安装 TensorFlow 安装 Python&#xff1a;TensorFlow 基于 Python&#xff0c;确保已安装 Python&#xff08;推荐 Python 3.8 及以上版本&#xff09;。可通过 Pyt…

如何在华为harmonyOS上调试软件

1、设置-》关于手机-》HarmonyOS 版本连按多下&#xff0c;输入锁屏密码。显示开发者模式已打开。 2、设置-》搜索“开发人员选项”-》开启“开发人员选项”选项。 3、在 开发者选项 中找到 “USB 调试” 并开启。 4、开启 “仅充电时允许 ADB 调试”。 5、设置中开启 &quo…

fpga系列 HDL:Quartus II JTAG 间接配置文件 Indirect Configuration File (.jic) AS模式烧录

先编译生成pof文件 File->Convert Programming Files 转换文件 Tools->Programer 烧录

Python:凯撒密码

题目内容&#xff1a; 凯撒密码是古罗马恺撒大帝用来对军事情报进行加密的算法&#xff0c;它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列该字符后面第三个字符&#xff0c;对应关系如下&#xff1a; 原文&#xff1a;A B C D E F G H I J K L M N O P Q R …

【大模型知识点】什么是KV Cache?为什么要使用KV Cache?使用KV Cache会带来什么问题?

1.什么是KV Cache&#xff1f;为什么要使用KV Cache&#xff1f; 理解此问题&#xff0c;首先需理解自注意机制的计算和掩码自注意力机制&#xff0c;在Decoder架构的模型中&#xff0c;每生成一个新的token&#xff0c;便需要重新执行一次自注意力计算&#xff0c;这个过程中…