首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL的MVCC是什么,有什么用?

MySQL的MVCC是什么,有什么用?

原创
作者头像
半月无霜
修改于 2024-08-21 11:53:33
修改于 2024-08-21 11:53:33
5490
举报
文章被收录于专栏:半月无霜半月无霜

MySQL的MVCC是什么,有什么用?

一、介绍

面试被问到了MVCC,我不知道啊,一脸懵逼!

于是回家查询了资料,记录一下

实际上,MVCC的全称是Multi Version ConCurrency Control,翻译过来就是多版本并发控制。

二、概念

1)隔离级别

指的是一种提高并发的技术。最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞。引入多版本之后,只有写写之间相互阻塞,其他三种操作都可以并行。在MySQL中,这样大幅度提高了InnoDB的并发度。在内部实现中,InnoDB通过undo log保存每条数据的多个版本,并且能够找回数据历史版本提供给用户读,每个事务读到的数据版本可能是不一样的。在同一个事务中,用户只能看到该事务创建快照之前已经提交的修改和该事务本身做的修改。

首先我们先了解一下数据库事务的隔离级别

  • 未提交读(READ UNCOMMITED):也就是脏读,当一个事务读取到另外一个事务修改但未提交的数据时
  • 已提交读 (READ COMMITED):简称RC
  • 可重复读(REPEATABLE READ):简称RR
  • 可串行化(SERIALIZABLE)

隔离级别

脏读

不可重复读

幻读

未提交读

可能

可能

可能

已提交读

不可能

可能

可能

可重复读

不可能

不可能

可能

可串行化

不可能

不可能

不可能

那么先介绍下面的现象

  • 脏读:当一个事务读取到另外一个事务修改但未提交的数据时
  • 不可重复读:在同一个事务中,同样的条件SQL查询出的结果不一致
  • 幻读:在同一个事务中,同样的条件SQL查询出的结果不一致(重点在于,数据有新增或者删除,导致的结果不一致)

2)undo log

在上面有提到undo log,那么这个undo log是什么呢?

实际上是当多个事务操作一条数据时,每个事务中的每个操作都会产生一条记录,比如说下面这样

可以看到,当一个事务TX111修改了数据值,就会产生一条undo log,并记录指向上一条最原始的这条undo log


如果有多条事务,修改同一条数据,那么就会产生链表一样的结构,我们称为undo log版本链表,如下

undo log,会进行删除,但不是立即删除。 它会在确保,当前undo log不被引用后,再进行删除。也就是当事务所有完成后,也就是commitrollback,保留最终确认下的undo log,并删除之前所有的版本链。

3)快照读、当前读

好的,现在要介绍一下快照读和当前读,只要介绍了这个,我们就能了解MVCC到底是什么了

  • 快照读readView):当执行查询select语句时,提取数据的一个记录
  • 当前读:当执行下面的语句时,提取数据的一个记录
    • insertupdatedeleteselect...for updateselect...lock in share mode

上面了解到他们是一个数据记录,那么其中他们有什么数据呢

字段

说明

m_ids

当前活跃的事务编号集合,也就是还没有被提交回滚的事务集合

min_trx_id

最小的活跃事务编号

max_trx_id

预分配事务编号,当前最大事务编号+1

creator_trx_id

快照读创建者的事务编号

好的,我们来进行理解一下这个快照读

4)多版本并发控制流程

上面的概念都看完了,接下来可以讲讲MVCC了,他是怎么使用RRRC来影响事务读取的数据的呢?

快照读配合当前读会影响,读取的结果,我们看下面的undo logreadView

我们要确定版本时,就是拿着快照读去匹配版本链上的每一个undo log,从最后往前进行判断

使用这些判断条件,MySQL就能确定要读取的版本了

  1. 判断undo logtrx_id == creator_trx_id
    1. 相等,则说明这条undo log修改,就是本事务自己更新修改的。可以访问
  2. 判断undo logtrx_id < min_trx_id
    1. 成立,则说明当前判断的这个undo log已经提交。可以访问
  3. 判断undo logtrx_id >= max_trx_id
    1. 成立,则说明当前判断的这个undo log,是在产生快照读之后创建的事务。所以不允许访问
  4. 判断min_trx_id <= trx_id < max_trx_id,成立则继续判断,trx_id是否存在于m_ids里面
    1. 成立,则说明undo log的事务还没有提交。不允许访问
    2. 不成立,则说明undo log的事务已经提交。允许访问

根据上面的判断条件,我们来进行判断

  • 首先是第一个undo log
    1. trx_id == creator_trx_id,即TX222 == TX333。不成立,继续下一个判断条件
    2. trx_id < min_trx_id,即TX222 < TX222。不成立,则继续下一个判断条件
    3. trx_id >= max_trx_id,即TX222 >= TX334。不成立,则继续向下判断
    4. min_trx_id <= trx_id < max_trx_id,即TX222 <= TX222 <= TX334。成立,则还要判断是否处于活跃事务集合中
      1. TX222处于集合[TX222, TX333]之中,不允许访问
  • 上面的条件都不满足后,我们将要继续下一个undolog
    1. trx_id == creator_trx_id,即TX111 == TX333。不成立,继续下一个判断条件
    2. trx_id < min_trx_id,即TX111 < TX222
      1. 成立,则说明TX111的事务已经提交,允许访问,确定下来一个数据的访问

按照上面的方法,进行判断

会读取到这样的一个结果,注意看,在TX333的事务下,三次读取出现了三次不同的结果,这便是不可重复读

那么MVCC该如何控制呢,其实问题主要的发生原因,是每次的readView不一致导致的,既然快照读不一致,所查询的结果肯定也不一致。

那么只需要,将同一个事务中快照读,变成同一份,不就是可重复读的隔离级别了嘛。

故事务中,将第一次快照读进行保存,后面的读取都按照这份快照读进行复用。


那么为什么说可重复读RR,并不能完全解决幻读的问题呢?

因为,在同一个事务中,快照读是复用的,一旦事务中出现了一次当前读,也就是执行了update等语句,那么就会重新刷新快照读。一旦快照读发生了改变,幻读就有可能出现了。

不可重复读,是指一个事务中,两次读取的结果不一致的现象。 但同一个事务中,如果是因为自己修改了数据,从而导致两次查询结果不一致的情况,这是正常现象,不叫不可重复读 这也正是,为什么发生当前读后,快照读要重新进行生成的原因。因为要读取到自己事务上一刻修改的数据。

三、最后

好了,我是被面试问到的,真的是一脸懵逼,服了

我是半月,你我一同共勉!!!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入了解Mysql的MVCC机制
早上上班途中,趁着坐地铁的功夫翻了翻高性能mysql这本书,准备回顾一下MVCC这块的知识点,因为书中对MVCC的讲解不是很多,于是我很快便看完了这一段落,但是文章末尾有一段话引起了我的思考。
敲得码黛
2021/11/01
1.4K0
深入了解Mysql的MVCC机制
MySQL 学习笔记(二)MVCC 机制
之前在讲 MySQL 事务隔离性提到过,对于写操作给读操作的影响这种情形下发生的脏读、不可重复读、虚读问题。是通过MVCC 机制来进行解决的,那么MVCC到底是如何实现的,其内部原理是怎样的呢?我们要抓住三个方面:记录中的4个隐藏字段、undo log 和 read view。
归思君
2023/10/16
2930
MySQL 学习笔记(二)MVCC 机制
图文结合带你搞懂InnoDB MVCC
事务有四大特性ACID分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
老叶茶馆
2023/02/18
7120
图文结合带你搞懂InnoDB MVCC
数据库篇:mysql事务原理之MVCC视图+锁
MVCC 全称Multi-Version Concurrency Control,其好处是读不加锁,读写不冲突,并发性能好
潜行前行
2022/04/26
4820
数据库篇:mysql事务原理之MVCC视图+锁
结合图文一起搞懂MySQL事务、MVCC、ReadView!
上次讲完MySQL的三大日志 undolog、redolog、binlog后,有必要把关于MySQL事务分析的文章马上给续上,我们知道在多并发事务处理的MVCC【多版本并发控制】中是有涉及到undo log日志的。
小许code
2023/09/18
4.3K4
结合图文一起搞懂MySQL事务、MVCC、ReadView!
探讨MySQL事务的特性与原理(理解MySQL的隔离级别及MVCC)
MySQL是日常开发中使用最广泛的数据库,深入理解它的特性、隔离级别等有助于我们更好地解决实际问题
潋湄
2024/09/19
1880
探讨MySQL事务的特性与原理(理解MySQL的隔离级别及MVCC)
深入理解MySQL的MVCC原理
MVCC(Mutil Version Concurrency Control)多版本并发控制,是一种并发控制的方法(而非具体实现),一般在数据库管理系统中,实现对数据库的并发访问。
DannyHoo
2022/04/02
6790
深入理解MySQL的MVCC原理
MySQL底层概述—9.ACID与事务
每写一个事务都会修改Buffer Pool,产生Redo、Undo日志。如果事务提交后redo log已刷入磁盘,此时机器恰好宕机了,那么就可以根据redo log恢复事务修改过的缓存数据。如果需要回滚事务,那么就可以基于undo log进行回滚,也就是通过undo log回滚事务之前对缓存页做的修改。所以undo日志实现了事务的原子性。
东阳马生架构
2025/02/13
2120
Mysql详解
在使用 Mysql 集群时,通常master节点负责写操作,slave节点负责读操作。主节点写入的数据同步到从节点的具体实现是:
羽毛球初学者
2024/10/15
1420
MVCC 原理分析、MySQL是如何解决幻读的
还记得MySQL事务四大特性、并发事务问题、事务隔离级别吗?幻读又是什么呢?如果忘记可以到这里重新温习:MySQL基础:SQL分类DDL、DML、DQL、DCL;函数、约束、多表查询、事务、并发事务四大问题、事务隔离级别——脏写、脏读、不可重复读、幻读
寻求出路的程序媛
2024/05/22
8870
MVCC 原理分析、MySQL是如何解决幻读的
mysql事务隔离级别与MVCC
事务A和事务B都读取了同一行数据, 比如原数据行的值是100,事务A是将数值读取出来+1并更新, 事务B是读取数值+2并更新。当事务A和事务B都读取到了100,事务A首先完成并更新为101,事务B随后完成更新成了102。这样事务B就把事务A的结果覆盖了。
leobhao
2022/06/28
4260
mysql事务隔离级别与MVCC
面试官:说说MVCC的执行原理?
MVCC(Multi-Version Concurrency Control)是一种并发控制机制,用于解决数据库并发访问中,数据一致性问题。它通过在读写操作期间保存多个数据版本,以提供并发事务间的隔离性,从而避免了传统的锁机制所带来的资源争用和阻塞问题。
磊哥
2023/12/27
4230
面试官:说说MVCC的执行原理?
事务隔离级别实现原理
数据库隔离级别以及Mysql实操 一文中,我描述了为了解决并发事务间的冲突,实现事务的隔离性,SQL标椎定义了四种隔离级别,今天就通过这篇文章来看下SQL标准中每种隔离级别的实现原理以及InnoDB引擎又是如何实现的。
Orlion
2024/09/02
2680
事务隔离级别实现原理
Mysql的MVCC——Mysql系列(五)
全称Multi-Version Concurrency Control,即多版本并发控制。它是一种并发控制的方法,它可以维护一个数据的多个版本,用更好的方式去处理读写冲突,做到即使有读写冲突也能不加锁。
翰墨飘香
2023/06/14
8410
MySQL高级12-事务原理
  事务是一组操作的集合,他是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或者撤销请求操作,即这些操作要么同时成功,要么同时失败。
Se7eN_HOU
2023/09/21
3160
MySQL高级12-事务原理
事务隔离级别与MVCC (1)—mysql进阶(六十七)
前面我们说了undo日志写入undo页面链表时,先需要把undo page header、undo segment header、undo log header等。每个事务都会有相应的undo链表,如果只存储一点数据不是很浪费吗,于是有了可重用,满足当前链表只有一个页,并且小于总空间的3/4。还介绍了回滚段,默认128个回滚段,每个段有1024个undo slot,每个slot分配给不同的事务,对应一个单独的undo页面链表。Undo日志也会记录redo日志,但临时表的undo日志写入不会记录redo日志,他的记录过程是先修改了数据,则会在系统表空间申请一个rollback segment header页面地址,循环获取,从第0号,第33~127号。分配了回滚段后,在段里查看cache是否存在undo slot,不存在就去rollback_segment_header找到一个undo slot分配该事务,如果没找到,则需要去undo log segment申请一个first undo page
keying
2022/07/29
4360
面试必问之事务的隔离级别与MVCC
对一个服务器来说,可以有多个客户端连接,而且每一个事务都对应一次数据状态的变换,为了保证事务的ACID4大特性,如果单纯的串行的执行事务,则会降低系统吞吐量与资源利用率,所以mysql选择了可串型化执行,舍弃了一部分隔离性来换取一部分性能,也就是某个事务操作某个数据时,其他试图操作相同的数据的事务需要等待,当事务提交时,其他操作相同的数据的事务才可能进行操作,不操作相同的数据则并行操作。
热心的大肚皮
2023/02/28
2680
面试必问之事务的隔离级别与MVCC
MySQL MVCC多版本并发控制(脏读和不可重复读解决原理)
MVCC是多版本并发控制(Multi-Version Concurrency Control),是MySQL中基于乐观锁理论实现隔离级别的方式,用于实现已提交读和可重复读隔离级别,也经常称为多版本数据库。MVCC机制会生成一个数据请求时间点的一致性数据快照 (Snapshot), 并用这个快照来提供一定级别 (语句级或事务级) 的一致性读取。从用户的角度来看,好象是数据库可以提供同一数据的多个版本(系统版本号和事务版本号)
终有救赎
2023/11/08
2K0
MySQL MVCC多版本并发控制(脏读和不可重复读解决原理)
绝对最直白的MySQL MVCC机制总结,免费拿走
事务集合: 事务A:设置id=1088的name为张三 事务B:设置id=1088的name为张小三 事务C:设置id=1088的name为张老三 事务D:两次查询id=1088的名字
知识浅谈
2022/11/21
4280
绝对最直白的MySQL MVCC机制总结,免费拿走
MVCC 原理
一个事务读取了另外一个事务修改后记录 强调的是 update 和delete ,只需要锁住满足条件的记录即可
王小明_HIT
2020/06/16
7771
MVCC 原理
相关推荐
深入了解Mysql的MVCC机制
更多 >
LV.1
这个人很懒,什么都没有留下~
作者相关精选
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档