深入理解MySQL的MVCC(多版本并发控制)实现原理

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 总结起来,MVVC技术使得MySQL能够有效地支持高并发环境中复杂交互要求; 然而合理配置及运维管理仍然关键确保系统长期稳健运转.

MySQL的多版本并发控制(MVCC)是一种用于提高数据库并发性能的技术,它允许在不锁定资源的情况下执行读取操作,同时保证事务隔离性。MVCC在InnoDB存储引擎中得到了广泛应用。

MVCC工作原理

1. 隐藏列和行版本控制

InnoDB为每行数据添加了三个隐藏列:DB_TRX_ID、DB_ROLL_PTR和DB_ROW_ID。其中,DB_TRX_ID记录最后修改该行数据的事务ID;DB_ROLL_PTR指向undo log记录;而当表没有主键或唯一非空索引时,InnoDB会使用隐藏的自增列DB_ROW_ID作为隐式主键。

2. Undo日志

当进行UPDATE或DELETE操作时,原始数据不会立即被覆盖或删除。相反,在修改之前会将原始数据复制到undo日志中。这样即使进行了更改,在事务提交之前其他事务仍然可以看到旧版本的数据。

3. Read View

Read View是一个逻辑视图概念,在READ COMMITTED和REPEATABLE READ两种隔离级别下工作方式略有不同。

  • 在READ COMMITTED模式下:每次查询开始时都创建一个新Read View。
  • 在REPEATABLE READ模式下:第一次查询时创建Read View,并在整个事务期间使用相同视图。

这个视图定义了哪些版本对当前读取操作是可见的:

  • 创建该视图时活跃(未提交)事务生成新版本对当前读取操作不可见。
  • 创建该视图后开始且已经结束(已提交) 的所有更改对当前读取都可见。

通过这种方式保证各个隔离级别能够正确实现其语义要求。

4. 多版并发控制规则

当执行SELECT语句来访问某些记录时:

  1. 如果记录最后被插入或更新所属于已经提交完成且比当前正在执行SELECT语句所属于那个早开启(小) 的那些transaction,则可以直接看到它;
  2. 如果比SELECT所属transaction晚开启(大) 或者还没结束,则需要通过undo log找回修改前(老) 的值;
  3. 对DELETE标记删除而未实际删除也适用上述规则来判断是否可见,并临床上加以处理以确保正确性;

MVCC优势与应用场景

MVCC允许多用户同时对数据库进行读写而互不干扰:

  1. 非阻塞性读 - SELECT查询通常无需等待其他写入完成即可获取信息;
    2.高效率写 - 写入只需添加新版信息至undo log, 而无须等待其他可能正在进行中阅览完毕;
    3.快照回滚支持 - 可以很容易地恢复至某特定时间点状态, 因为历史信息得以保存;

由此特点决定其广泛应用于需要高度并发处理与稳健稳态维护场景如在线交易平台、大型网站后台数据库等领域内部署使用.

思考与优化策略

虽然MVCC提供诸多好处, 然而也存在如幽灵问题、历史列表过长导致效率降低问题等挑战.
针对此类问题, 可采纳以下策略:
1.合理设置 innodb_history_list_length参数管理历史列表长度;
2.调整自动垃圾收集机制确保及早清除无需再维护老版;
3.根据业界标准及具体业态调整MySQL配置参数达成最佳平衡.

总结起来,MVVC技术使得MySQL能够有效地支持高并发环境中复杂交互要求; 然而合理配置及运维管理仍然关键确保系统长期稳健运转.

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
22天前
|
存储 关系型数据库 MySQL
MySQL中的int(10)、char(10)与varchar(10)的类型和区别
在选择正确的数据类型时,需要仔细考虑每列的数据特点及应用程序的使用情况。合理的数据类型选择可以优化存储空间的使用,提高查询速度和数据库的整体性能。
141 14
|
22天前
|
存储 安全 Linux
处理Git错误:“invalid object [hash]”和“unable to read tree [hash]”
通过以上步骤,通常能够处理并解决Git中的“invalid object [hash]”和“unable to read tree [hash]”错误。当处理这些问题时,需要谨慎操作,因为错误的操作可能会导致数据丢失。如果不确定如何进行,考虑寻求有经验的同事或Git社区的帮助。
87 16
|
17天前
|
人工智能 运维 安全
|
21天前
|
存储 人工智能 运维
AI 网关代理 RAG 检索:Dify 轻松对接外部知识库的新实践
Higress AI 网关通过提供关键桥梁作用,支持 Dify 应用便捷对接业界成熟的 RAG 引擎。通过 AI 网关将 Dify 的高效编排能力与专业 RAG 引擎的检索效能结合,企业可在保留现有 Dify 应用资产的同时,有效规避其内置 RAG 的局限,显著提升知识驱动型 AI 应用的生产环境表现。
493 59
|
24天前
|
Java
Java的CAS机制深度解析
CAS(Compare-And-Swap)是并发编程中的原子操作,用于实现多线程环境下的无锁数据同步。它通过比较内存值与预期值,决定是否更新值,从而避免锁的使用。CAS广泛应用于Java的原子类和并发包中,如AtomicInteger和ConcurrentHashMap,提升了并发性能。尽管CAS具有高性能、无死锁等优点,但也存在ABA问题、循环开销大及仅支持单变量原子操作等缺点。合理使用CAS,结合实际场景选择同步机制,能有效提升程序性能。
|
4天前
|
网络安全 开发工具 git
配置本地环境以管理Git多账户SSH连接的方法
通过以上步駟设置后, 您可以轻松管理多個 Git 账户并且根据不同项目需求切换 SSH 密匙进行版本控制操作。
90 20
|
4天前
|
SQL 关系型数据库 MySQL
MySQL的查询操作语法要点
储存过程(Stored Procedures) 和 函数(Functions) : 储存过程和函数允许用户编写 SQL 脚本执行复杂任务.
72 14
|
1月前
|
人工智能 算法 测试技术
轻量高效,8B 性能强劲书生科学多模态模型Intern-S1-mini开源
继 7 月 26 日开源『书生』科学多模态大模型 Intern-S1 之后,上海人工智能实验室(上海AI实验室)在8月23日推出了轻量化版本 Intern-S1-mini。
473 50
|
23天前
|
XML Java 数据格式
Bean的生命周期:从Spring的子宫到坟墓
Spring 管理 Bean 的生命周期,从对象注册、实例化、属性注入、初始化、使用到销毁,全程可控。Bean 的创建基于配置或注解,Spring 在容器启动时扫描并生成 BeanDefinition,按需实例化并填充依赖。通过 Aware 回调、初始化方法、AOP 代理等机制,实现灵活扩展。了解 Bean 生命周期有助于更好地掌握 Spring 框架运行机制,提升开发效率与系统可维护性。
|
2天前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
59 12