简述Mysql InnoDB的MVCC机制

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 简述Mysql InnoDB的MVCC机制

什么是MVCC

MVCC是Multi-Version Concurrency Control的缩写,也就是多版本并发控制。在Mysql InnoDB中用来处理读写冲突,实现非阻塞并发读,以达到更好的数据库并发性能。

当前读和快照读

说到MVCC,就不得不提当前读和快照读。

  • 当前读
    当前读,顾名思义就是读取当前的最新数据。比如select for updateselect lock in share modeupdateinsertdelete等都属于当前读,因为这些操作都会对数据进行加锁,避免其他并发事务不能修改当前记录,以保证读取到的是最新数据。
  • 快照读
    快照读就是读取某一时刻的记录,读取这样的数据是不需要加锁的。比如select操作就是快照读,这样处理可以有效提升数据库的并发读写能力。快照读的实现就是基于MVCC。

也就是说,当前读和快照读的区别就在于:当前读是加锁的,是悲观锁的实现;快照读是不加锁的,基于MVCC实现;

MVCC解决了什么问题

  • 数据库读写并发能力
    在并发读写数据时,可以做到在读写操作不用相互阻塞,提升数据库并发读写性能;因为select操作是快照读,updateinsertdelete操作是当前读,两者不会相互阻塞;
  • 解决脏读、不可重复读、幻读等问题
    MVCC与Read View结合可以解决脏读、不可重复读、幻读事务隔离问题;

MVCC是怎么实现的

MVCC设计出来的目的就是为了解决读写冲突,它的实现主要依赖于4个隐式字段、undolog、Read View;

  • 隐式字段
    数据库在每一行数据记录外额外增加了3个隐式字段:
DB_ROW_ID DB_TRX_ID DB_ROLL_PTR DELETED_BIT
隐藏主键 事务ID 回滚指针 记录被更新或者被删除标记

1.隐藏主键:隐含的自增ID,如果数据表没有设置主键,InnoDB会自动以DB_ROW_ID生成一个聚簇索引;

2.事务ID:记录创建这条记录/或者最后一次修改这条记录的事务ID;

3.回滚指针:记录这条记录的上一个版本;

4.记录被更新或者被删除标记:修改操作是给当前记录打上DELETED_BIT=true的标记,另外再创建一条新记录;删除操作是给当前记录打上DELETED_BIT=true的标记;都不是真正地把数据删掉;

  • undo日志

除了查询操作不会记录undo log外,其他的updateinsertdelete操作都会记录对应的undo log;

1.比如有一个user表已经插入一条新记录,name=zouwei,age=28,隐藏主键为1:

image.png

2.现在再来一个事务1针对该记录的name做出修改,改名为Z

  • 在事务1修改该记录时,数据库先给该记录加上排他锁;
  • 然后再把当前记录拷贝一份到undo log中,DELETED_BIT设置为true;
  • 拷贝完毕后,修改改记录name=Z,并把DB_TRX_ID设置为1,DB_ROLL_PTR指向undlog中的副本,也就是当前记录的上一个版本;
  • 事务提交,释放排他锁;

image.png

  • 3.再来一个事务2修改该记录的age=30
  • 在事务2修改该记录时,同样先给该记录加上排他锁;
  • 然后再把当前记录拷贝一份到undo log中,DELETED_BIT设置为true;
  • 拷贝完毕后,修改改记录age=30,并把DB_TRX_ID设置为2,DB_ROLL_PTR指向undlog中的副本,也就是当前记录的上一个版本;
  • 事务提交,释放排他锁;

image.png

  • 也就是说,不同事务针对同一记录做修改,undo log会产生该记录的版本链条,链首是该记录的最新旧数据,链尾是该记录的最早旧数据;
  • Read ViewRead View就是在事务中,执行快照读操作时,生成的读视图;在该事务执行快照读的那一刻,会生成数据库当前的一个快照,记录并维护了当前活跃的事务ID(事务ID被分配时是递增的);Read View的作用就是用来判断在执行快照读时,当前事务在undo log链中,哪些旧数据是可以被看见的;Read View可见性算法大致如下:

Read View中包含大概三个全局属性:

1.trx_list:未提交事务ID列表;

2.up_limit_id:trx_list中的最小事务ID;

3.low_limit_id:创建视图那一刻,下一个系统尚未分配的事务ID;

  • 在undo log中,DB_TRX_ID小于up_limit_id的记录都是可见的;
  • 如果DB_TRX_ID大于low_limit_id,那么说明该记录时在创建Read View后写进来的,那肯定是不可见的;
  • 那么还要检测DB_TRX_ID是否在trx_list中,如果不在,那么说明事务已经提交,那么该记录可见,否则说明该事务还未提交,不可见;

Read View在RR隔离级别和RC隔离级别的区别

  • 在RR隔离级别下,事务对某条记录的第一次快照读会创建一个Read View,此后再调用快照读的时候,使用的还是同一个Read View;所以当前事务只要在其他事务提交之前使用过快照读,那么即使其他事务已经提交了,因为使用的是同一个Read View,所以依然还是看不见提交的数据;
  • 在RC隔离级别下,每一次快照读都会重新生成一个新的Read View,所以我们就可以在RC隔离级别下看到其他事务提交的数据;


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
7月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
10月前
|
存储 网络协议 关系型数据库
MySQL8.4创建keyring给InnoDB表进行静态数据加密
MySQL8.4创建keyring给InnoDB表进行静态数据加密
388 1
|
5月前
|
存储 关系型数据库 MySQL
介绍MySQL的InnoDB引擎特性
总结而言 , Inno DB 引搞 是 MySQL 中 高 性 能 , 高 可靠 的 存 储选项 , 宽泛 应用于要求强 复杂交易处理场景 。
223 15
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
2153 57
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
12月前
|
SQL 关系型数据库 MySQL
京东面试:MySQL MVCC是如何实现的?如何通过MVCC实现读已提交、可重复读隔离级别的?
1.请解释什么是MVCC,它在数据库中的作用是什么? 2.在MySQL中,MVCC是如何实现的?请简述其工作原理。 3.MVCC是如何解决读-写和写-写冲突的? 4.在并发环境中,当多个事务同时读取同一行数据时,MVCC是如何保证每个事务看到的数据版本是一致的? 5.MVCC如何帮助提高数据库的并发性能?
京东面试:MySQL MVCC是如何实现的?如何通过MVCC实现读已提交、可重复读隔离级别的?
|
10月前
|
SQL 缓存 关系型数据库
使用温InnoDB缓冲池启动MySQL测试
使用温InnoDB缓冲池启动MySQL测试
192 0
|
SQL 存储 关系型数据库
MySQL进阶突击系列(05)突击MVCC核心原理 | 左右护法ReadView视图和undoLog版本链强强联合
2024年小结:感谢阿里云开发者社区每月的分享交流活动,支持持续学习和进步。过去五个月投稿29篇,其中17篇获高分认可。本文详细介绍了MySQL InnoDB存储引擎的MVCC机制,包括数据版本链、readView视图及解决脏读、不可重复读、幻读问题的demo演示。
|
存储 关系型数据库 MySQL
MySQL存储引擎详述:InnoDB为何胜出?
MySQL 是最流行的开源关系型数据库之一,其存储引擎设计是其高效灵活的关键。InnoDB 作为默认存储引擎,支持事务、行级锁和外键约束,适用于高并发读写和数据完整性要求高的场景;而 MyISAM 不支持事务,适合读密集且对事务要求不高的应用。根据不同需求选择合适的存储引擎至关重要,官方推荐大多数场景使用 InnoDB。
634 7
|
5月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
439 158
|
5月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。

推荐镜像

更多