MySQL中的MVCC是怎么实现的,你们知道吗?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 不晓得大家了解不了解MySQL的MVCC机制,这个是MySQL底层原理中比较重要的一项,它能极大的提高MySQL数据库的并发性能。MVCC广泛应用于数据库技术,像Oracle,PostgreSQL等都引入了该技术。本篇文章我们就带大家一起了解一下MySQL的MVCC机制实现原理。

什么是MVCC?

Multi-Version Concurrency Control(MVCC),翻译过来就是多版本并发控制,MVCC是为提高MySQL数据库并发性能的一个重要设计。

同一行数据发生读写请求时,会通过锁来保证数据的一致性。MVCC可以在读写冲突时,让其读数据时通过快照读,而不是当前读,快照读不必加锁。

在前边文章我们也介绍了MySQL中的锁机制,不熟悉的可以翻阅前边的文章。

InnoDB的事务

MySQL中的MVCC是在InnoDB存储引擎中得到支持的,InnoDB中最重要,也是最特殊的可谓就是事务,所以事务相关的一些设计我们必须了解。
  • 行级锁 InnoDB提供了行级锁,行级锁无疑使锁的粒度更细,但是数据过多时,在高并发场景下,同一时刻会产生大量的锁,因此,InnoDB也对锁进行了空间的有效优化,使得其在并发量高的情况下,也不会因为同一时刻锁过多,而导致内存耗尽。

    • 排他锁
    • 共享锁。
  • 隔离级别

    • READ_UNCOMMITTED:脏读
    • READ_COMMITTED:读提交
    • REPEATABLE_READ:重复读
    • SERIALIZABLE:串行化
  • redo log

    redo log 就是保存执行的SQL语句到一个指定的Log文件,当Mysql执行recovery时重新执行redo log记录的SQL操作即可。当客户端执行每条SQL(更新语句)时,redo log会被首先写入log buffer;当客户端执行COMMIT命令时,log buffer中的内容会被视情况刷新到磁盘。redo log在磁盘上作为一个独立的文件存在,即InnoDB的log文件。

  • undo log

    与redo log相反,undo log是为回滚而用,具体内容就是将事务影响到的行的原始数据行写入到到undo buffer,在合适的时间把undo buffer中的内容刷新到磁盘。undo buffer与redo buffer一样,也是环形缓冲,但当缓冲满的时候,undo buffer中的内容会也会被刷新到磁盘;与redo log不同的是,磁盘上不存在单独的undo log文件,所有的undo log均存放在主ibd(表空间)数据文件中,即使客户端设置了每表一个数据文件也是如此。

行更新的过程

InnoDB为每行记录都实现了三个隐藏字段:

  • 隐藏的ID
  • 6字节的事务ID(DB_TRX_ID
  • 7字节的回滚指针(DB_ROLL_PTR

行更新的过程

  1. 数据库新增一条数据,该条数据三个隐藏字段,只有ID有值
  2. T1修改该条数据,开启事务,记录read_view

    • 排它锁锁定该行数据
    • 记录redo log
    • 将该行数据写入undo log
    • 将修改值写入该条数据,填写事务Id,根据undo log记录位置填写回滚指针
  3. T2修改该条数据,开启事务,记录read_view

    • 排它锁锁定该行数据
    • 记录redo log
    • 将该行数据写入undo log
    • 将修改值写入该条数据,填写事务Id,通过回滚指针将undo log 的两条记录连接起来(版本链)
  4. 事务提交,记录read_view

    • 正常提交
    • 如果触发回滚,需要根据回滚指针找到undo log对应记录进行回滚

注意:

  • InnoDB中存在purge线程,它负责查询,并清理那些无效的undo log。
  • 上述过程描述的是UPDATE事务的过程,当INSERT时,原始的数据并不存在,所以在回滚时把insert丢弃即可

MVCC的基本特征

  • 每行数据都存在一个版本,每次更新数据时都更新该版本。
  • 修改时拷贝出当前版本随意修改,各个事务之间无干扰。
  • 保存时比较版本号,如果成功提交事务,则覆盖原记录;如果失败回滚则放弃拷贝的数据。

InnoDB如何实现MVCC?

MVCC则是建立在undo log 之上的。

undo log 中记录的数据就是MVCC中的多版本。

通过回滚指针形成版本链。

通过事务ID可以查找到read-view上的记录

RC隔离级别和RR隔离级别生成read-view的时机不一样,RR是在开始事务时,RC是在每一次查询,所以在RR隔离级别下,MVCC可以解决幻读问题。

read-view记录:

  • m_ids:表示活跃事务id列表
  • min_trx_id:活跃事务中的最小事务id
  • max_trx_id:已创建的最大事务id
  • creator_trx_id:当前的事务id

版本链比对规则:

  1. 如果 trx_id < min_trx_id,表示这个版本是已提交的事务生成的,这个数据是可见的;
  2. 如果 trx_id > max_trx_id,表示这个版本是由将来启动的事务生成的,是肯定不可见的。
  3. 如果 min_trx_id <= trx_id <= max_trx_id,那就包括两种情况

    • 若row的trx_id在m_ids数组中,表示这个版本是由还没提交的事务生成的,不可见,当前自己的事务是可见的。
    • 若row的trx_id不在m_ids数组中,表示这个版本是已经提交了的事务生成的,可见

MySQL的InnoDB实现MVCC,就是在隔离级别为读已提交可重复读,基于乐观锁理论,通过事务ID和read-view的记录进行比较判断分析数据是否可见,从而使其大部分读操作可以无需加锁,从而提高并发性能。

但是在写数据的时候,InnoDB还是需要加排它锁的。

总结,就是用乐观锁代替悲观锁,从而提高并发性能,这就是MVCC。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
关系型数据库 MySQL
Mysql的MVCC机制
Mysql的MVCC机制
|
Oracle 关系型数据库 MySQL
MySQL相关(六)- 事务隔离级别的实现方案(MVCC)
MySQL相关(六)- 事务隔离级别的实现方案(MVCC)
146 0
|
3月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
11月前
|
存储 关系型数据库 MySQL
MySQL MVCC全面解读:掌握并发控制的核心机制
【10月更文挑战第15天】 在数据库管理系统中,MySQL的InnoDB存储引擎采用了一种称为MVCC(Multi-Version Concurrency Control,多版本并发控制)的技术来处理事务的并发访问。MVCC不仅提高了数据库的并发性能,还保证了事务的隔离性。本文将深入探讨MySQL中的MVCC机制,为你在面试中遇到的相关问题提供全面的解答。
832 2
|
8月前
|
SQL 关系型数据库 MySQL
京东面试:MySQL MVCC是如何实现的?如何通过MVCC实现读已提交、可重复读隔离级别的?
1.请解释什么是MVCC,它在数据库中的作用是什么? 2.在MySQL中,MVCC是如何实现的?请简述其工作原理。 3.MVCC是如何解决读-写和写-写冲突的? 4.在并发环境中,当多个事务同时读取同一行数据时,MVCC是如何保证每个事务看到的数据版本是一致的? 5.MVCC如何帮助提高数据库的并发性能?
京东面试:MySQL MVCC是如何实现的?如何通过MVCC实现读已提交、可重复读隔离级别的?
|
存储 关系型数据库 MySQL
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
|
9月前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(05)突击MVCC核心原理 | 左右护法ReadView视图和undoLog版本链强强联合
2024年小结:感谢阿里云开发者社区每月的分享交流活动,支持持续学习和进步。过去五个月投稿29篇,其中17篇获高分认可。本文详细介绍了MySQL InnoDB存储引擎的MVCC机制,包括数据版本链、readView视图及解决脏读、不可重复读、幻读问题的demo演示。
|
11月前
|
存储 关系型数据库 MySQL
MySQL MVCC深度解析:掌握并发控制的艺术
【10月更文挑战第23天】 在数据库领域,MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种重要的并发控制机制,它允许多个事务并发执行而不产生冲突。MySQL作为广泛使用的数据库系统,其InnoDB存储引擎就采用了MVCC来处理事务。本文将深入探讨MySQL中的MVCC机制,帮助你在面试中自信应对相关问题。
390 3
|
关系型数据库 MySQL 数据库
MySQL高级篇——MVCC多版本并发控制
什么是MVCC、快照读与当前读、隐藏字段、Undo Log版本链、ReadView、举例说明、InnoDB 解决幻读问题
MySQL高级篇——MVCC多版本并发控制
|
SQL 关系型数据库 MySQL
Mysql原理与调优-事务与MVCC
【8月更文挑战第19天】

推荐镜像

更多