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,如有侵权,请联系删除。

相关推荐
Otaku love travel38 分钟前
老系统改造增加初始化,自动化数据源配置(tomcat+jsp+springmvc)
java·tomcat·初始化·动态数据源
DKPT1 小时前
Java设计模式之行为型模式(责任链模式)介绍与说明
java·笔记·学习·观察者模式·设计模式
L_autinue_Star1 小时前
手写vector容器:C++模板实战指南(从0到1掌握泛型编程)
java·c语言·开发语言·c++·学习·stl
晨岳1 小时前
CentOS 安装 JDK+ NGINX+ Tomcat + Redis + MySQL搭建项目环境
java·redis·mysql·nginx·centos·tomcat
执笔诉情殇〆1 小时前
前后端分离(java) 和 Nginx在服务器上的完整部署方案(redis、minio)
java·服务器·redis·nginx·minio
YuTaoShao2 小时前
【LeetCode 热题 100】24. 两两交换链表中的节点——(解法一)迭代+哨兵
java·算法·leetcode·链表
程序员的世界你不懂2 小时前
(20)Java+Playwright自动化测试- 操作鼠标拖拽 - 上篇
java·python·计算机外设
AI360labs_atyun2 小时前
Java在AI时代的演进与应用:一个务实的视角
java·开发语言·人工智能·科技·学习·ai
不像程序员的程序媛3 小时前
redis的一些疑问
java·redis·mybatis
知其然亦知其所以然3 小时前
Java 面试高频题:GC 到底回收了什么、怎么回收、啥时候回收?
java·后端·面试