深入浅出地解释MySQL MVCC机制原理及实现方式。

简介: 总结起来,MVVC 在 MySQL 中通过结合乐观 并 发 控 制 和精巧设计内部结构使得数据库能够处理大规模 并 发 访问 覆盖 复杂场景需求同时保证高效率运转.

MySQL的多版本并发控制(MVCC)是一种用于提高数据库并发性能的技术,它允许多个事务同时对同一数据进行读写操作,而不会互相干扰。MVCC通过为每个事务创建数据的“快照”来工作,这样每个事务都可以看到一个一致性视图而不是最新写入的数据。

在MySQL中,MVCC主要通过InnoDB存储引擎实现。InnoDB使用以下几种机制来实现MVCC:

  1. 行级锁定:InnoDB存储引擎使用行级锁定而非表级锁定。这意味着当一个事务正在修改某些行时,其他事务仍然可以访问同表中未被加锁的其他行。

  2. 隐藏版本号:每当对数据库进行修改时(如INSERT、UPDATE或DELETE操作),InnoDB都会在内部为被修改或创建的记录添加两个隐藏字段:创建ID和删除ID。这些字段记录了哪些版本号(即哪些具体时间点上活跃着的) 的 事 务 可以看到该条记录。

  3. 撤销日志:撤销日志用于存储旧版数据信息,在回滚时恢复原始状态,并且支持构建早期版本以供读取操作使用。

  4. Read View机制:当一个非阻塞读取请求发生时,在Read View中定义了可见性规则决定了该请求能够看到哪个时间点上提交完成 的 数据 版本 。Read View会包含以下信息:

    • 系统当前未提交完成 的 最小 版本 号。
    • 当前活跃着且具有更小 版本 号 的 所有 交 易。
    • 当前交易自己 的 版本号。
  5. 快照读和当前读

    • 快照读(Snapshot Read)指SELECT语句在没有明确指明要求最新数据情况下,默认情况下只查阅那些已经提交完毕、并且根据 Read View 规则可见度判断后确定可以查阅到 数据 。它们通常不需要等待其他正在执行写入操作交易结束即可执行。
    • 当前度(Current Read)如UPDATE、DELETE等需要获取最新版 数据 进 行 操作 ,因此可能涉及等待获取相应 行 锁 或者 检测 到 冲突 覆盖 更 新 等 操作 ,确保所获得 数据 是 最 新 状态,并将更改应用于它们。
  6. 保存点和回滚段: InnoDB支持保存点技术允许用户定义某一特殊状态作为回滚参考,并利用回滚段来恢复至该状态或者维护低开销 下 处理 MVCC 必需历史信息.

  7. 清理过程: InnoDB周期性地清理那些建立起但已经过期无人参考之历史版 记录 ,释放空间供将 来 使用 。此 过程 称之 Purge, 它保证系统资源得以循环利用.

综合以上机制, MVCC 具备高效处理大量并发交易需求特质, 同时减少死 键 风险 并 提升系统整体吞吐量.

总结起来,MVVC 在 MySQL 中通过结合乐观 并 发 控 制 和精巧设计内部结构使得数据库能够处理大规模 并 发 访问 覆盖 复杂场景需求同时保证高效率运转.

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
11月前
|
SQL JSON 关系型数据库
EXPLAIN详解:MySQL查询优化必备工具
本文深入解析了MySQL中的EXPLAIN命令,帮助开发者识别和优化慢查询。通过分析执行计划,读者可以了解查询的性能瓶颈,并采取相应措施提升数据库效率。
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
|
存储 消息中间件 缓存
面试 Redis 没底?这 40 道面试题让你不再慌(附答案)
面试 Redis 没底?这 40 道面试题让你不再慌(附答案)
20097 1
|
存储 Java C++
JVM内存模型和结构详解(五大模型图解)
JVM内存模型和结构详解(五大模型图解)
|
Java 关系型数据库 MySQL
Springboot 导入导出Excel ,一对多关系,复合表格、合并单元格数据
Springboot 导入导出Excel ,一对多关系,复合表格、合并单元格数据
2732 1
Springboot 导入导出Excel ,一对多关系,复合表格、合并单元格数据
|
关系型数据库 MySQL 数据库
图解MySQL【日志】——两阶段提交
两阶段提交是为了解决Redo Log和Binlog日志在事务提交时可能出现的半成功状态,确保两者的一致性。它分为准备阶段和提交阶段,通过协调者和参与者协作完成。准备阶段中,协调者向所有参与者发送准备请求,参与者执行事务并回复是否同意提交;提交阶段中,若所有参与者同意,则协调者发送提交请求,否则发送回滚请求。MySQL通过这种方式保证了分布式事务的一致性,并引入组提交机制减少磁盘I/O次数,提升性能。
1619 5
图解MySQL【日志】——两阶段提交
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
2568 15
|
Kubernetes 网络协议 Shell
下载k8s.gcr.io仓库的镜像的两个方式
下载k8s.gcr.io仓库的镜像的两个方式
16358 0
|
消息中间件 调度 RocketMQ
【RocketMQ系列六】RocketMQ事务消息
【RocketMQ系列六】RocketMQ事务消息
3747 1
|
SQL 关系型数据库 数据库
学习分布式事务Seata看这一篇就够了,建议收藏
学习分布式事务Seata看这一篇就够了,建议收藏
25820 2