MVCC面试题总结

MVCC解决的问题

​   数据库并发场景有三种,分别为:

​   1、读读:不存在任何问题,也不需要并发控制

​   2、读写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读、幻读、不可重复读

​   3、写写:有线程安全问题,可能存在更新丢失问题

​  MVCC是一种用来解决读写冲突的无锁并发控制,也就是为事务分配单项增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照,所以MVCC可以为数据库解决以下问题:

​     1、在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能

​     2、解决脏读、幻读、不可重复读等事务隔离问题,但是不能解决更新丢失问题

一、谈谈你对Mysql的MVCC的理解?

MVCC是一种高并发版本控制器,一般用于数据库中对数据的并发访问。Mysql中的innoDB中就是使用这种方法来提高读写事务的并发性能、原因是MVCC是一种不采用锁来控制事务的方式,是一种非堵塞、同时还可以解决脏读,幻读,不可重复读等事务隔离问题,但不能解决更新丢失问题。

总之:就是MVCC是通过保存数据的历史版本,根据比较版本号来处理数据是否显示,从而达到读取数据的时候不需要加锁就可以保证事务隔离性的效果。

二、当前读和快照读

  1. 在高并发情况下,当前读是获取最新记录,并且不允许其他事务修改这个数据。
  2. 当前读是加了锁的、加的是一种悲观锁。而快照读是没加锁的。
  3. 快照读获取的则是单纯的 SELECT 语句,取的有可能是事务未提交的数据。

三、说一下MVCC的实现原理?

MVCC的实现原理是依靠:记录中的3个隐含字段、undo log日志、Read View实现的。

1:隐含字段:
DB\_TRX\_ID:记录操作该数据事务的事务id;  
DB\_ROLL\_PTR:指向上一个版本数据在undo log里的位置指针  
DB\_ROW\_ID:隐藏ID,当创建表没有合适的索引作为聚集索引时,会用该隐藏ID创建聚集索引
2:undo log日志:

insert undo log:事务进行插入操作时产生、在事务回滚时需要,提交事务后可以被立即丢

update undo log:进行update、delete时产生的undo log、不仅在回滚事务时需要、在快照读时也需要。所以不能随便删除,只有在快速读或事务回滚不涉及该日志时,对应的日志才会被purge线程统一清除(purge类似jvm中的gc垃圾回收器)

3:Read View(读视图)

read view读视图就是在进行快照读时会产生一个read view视图、在该事务执行的快照读的那一刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的ID(当每个事务开启时,都会被分配一个ID, 这个ID是递增的,所以最新的事务,ID值越大)。

总的来说就是用来记录发生快照读那一刻所有的记录,当你下次就算有执行新的事务记录改变了,read view没变,读出来的数据依然是不变的。

而隔离级别中的RR(可重复读)、和RC(提交读)不同就是差在快照读时

前者创建一个快照和Read View,并且下次快照读时使用的还是同一个Read View所以其他事务修改数据对他是不可见的、解决了不可重复读问题。

后者则是每次快照读时都会产生新的快照和Read View、所以就会产生不可重复读问题。

4:总结出 MVCC 实现的原理大致是:

InnoDB 每一行数据都有一个指向上一个版本数据在undo log日志里的位置指针。如果要执行更新操作,会将原记录放入 undo log 中,并通过隐藏的回滚指针指向 undo log 中的原记录。其它事务此时需要查询时,就是查询 undo log 中这行数据的最后一个历史版本。

MVCC 最大的好处是读不加锁,读写不冲突,极大地增加了 MySQL 的并发性。通过 MVCC,保证了事务的隔离性。

本文转自 https://blog.csdn.net/weixin_47465999/article/details/123299955,如有侵权,请联系删除。

相关推荐
七星静香23 分钟前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
Jacob程序员24 分钟前
java导出word文件(手绘)
java·开发语言·word
ZHOUPUYU25 分钟前
IntelliJ IDEA超详细下载安装教程(附安装包)
java·ide·intellij-idea
stewie628 分钟前
在IDEA中使用Git
java·git
Elaine20239143 分钟前
06 网络编程基础
java·网络
G丶AEOM1 小时前
分布式——BASE理论
java·分布式·八股
落落鱼20131 小时前
tp接口 入口文件 500 错误原因
java·开发语言
想要打 Acm 的小周同学呀1 小时前
LRU缓存算法
java·算法·缓存
镰刀出海1 小时前
Recyclerview缓存原理
java·开发语言·缓存·recyclerview·android面试
阿伟*rui3 小时前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel