java面试一日一题:讲对mysql的MVCC的理解
问题:请讲下对mysql中MVCC的理解
分析:这个问题要回答的是对MVCC的理解,以及MVCC解决了什么问题这几个方面入手。
回答要点:
主要从以下几点去考虑,
1、什么是MVCC?
2、MVCC用来解决什么问题?
3、MVCC是怎么实现的?
所谓MVCC,在mysql中指的是multi version concurrency control,即多版本并发控制。多版本比较好理解就是有多个版本,那么是指的什么有多个版本,这里指的是数据行,mysql中的数据行有多个版本,再看后面的并发控制,即对数据的行的读取和更新要并发控制,并发控制的目的是为了多线程下的数据安全,就像在java环境下的多线程安全,这里并不是指线程安全,而是指多个线程下的数据隔离级别。
MVCC只有在读已提交和可重复读两种隔离级别下才有效。我们都知道在读已提交隔离级别下解决了脏读,但存在不可重复读及幻读的情况,在可重复读隔离级别下解决了不可重复读和幻读(如何解决的下篇文章分享),下面就看下在这两个隔离级别下MVCC是如何其作用的。
MVCC的实现是通过undo log和read view来实现的
在innodb引擎下的表,每个数据行都有隐藏的两列,一列是trx_id,也就是更新(insert、update、delete)这条记录的事务ID;一列是roll_pointer,指向上次修改的指针,如果是新增的则为null;如果不存在主键的话,还会有第三列row_id,在没有主键的情况下默认生成的主键;
我们都知道在mysql的事务日志中有redo log和undo log,redo log记录的是真实改变的值,而undo log记录的是和操作相反的操作,由于一条记录可能会被修改多次,这些修改连在一起就形成了一个版本链,这个版本链就是MVCC实现的基础。
如下就是一个版本链

其中最后两列一个是trx_id,一个是roll_pointer。有了版本链,还有一个read view,看这是什么概念,翻译过来叫一致性视图,一致性视图中有以下几个属性比较重要,
m_ids,在生成read view时当前活跃的读写事务的列表
min_trx_id,m_ids中最小的
max_trx_id,m_ids中最大的+1
版本链中的trx_id是否对当前事务可见通过以下的规则进行判断,
trx_id<min_trx_id 表示数据中的事务ID比当前活跃的事务id最小的还小,代表该记录在生成readview的时候已经提交,那么是可见的;
trx_id>=max_trx_id 表示数据中的事务ID比当前活跃的事务id最大的还大,代表该记录在生成readview后提交的,那么是不可见的;
min_trx_id<=trx_id<max_trx_id 当trx_id在m_ids中表示,该事务还未提交,那么是不可见的;当trx_id不在m_ids中,说明已经提交了,那么是可见的;
如果某个版本的数据对当前事务是不可见的,那么就要顺着版本链继续查找下个版本,直到找到可见的版本。
那么在读已提交和可重复读下是如何实现的,在读已提交下,是每次select都会生成read view,所以可以读到提交的数据;在可重复读隔离级别下,是在第一次select的时候生成read view,以后的select都是使用第一次生成的read view,所以解决了不可重复读。
java面试一日一题:讲对mysql的MVCC的理解的更多相关文章
- java面试一日一题:讲下mysql中的undolog
问题:请讲下mysql中undo log的作用 分析:mysql中有很多日志,例,bin log undo log redo log,要弄清楚这些日志的作用,就要了解这些日志出现的背景及要解决的问题: ...
- java面试一日一题:mysql中常用的存储引擎有哪些?
问题:请讲下mysql中常用的引擎有哪些? 分析:该问题主要考察对mysql存储引擎的理解,及区别是什么? 回答要点: 主要从以下几点去考虑, 1.mysql的存储引擎的基本概念? 2.mysql中常 ...
- java面试一日一题:讲下在什么情况下会发生类加载
问题:请讲下在什么情况下会发生类加载? 分析:该问题主要考察对java中类加载的知识,什么是类加载,为什么会发生类加载,什么情况下发生类加载? 回答要点: 主要从以下几点去考虑 1.什么是类加载: 2 ...
- java面试一日一题:java中垃圾回收算法有哪些
问题:请讲下在java中有哪些垃圾回收算法 分析:该问题主要考察对java中垃圾回收的算法以及使用场景 回答要点: 主要从以下几点去考虑, 1.GC回收算法有哪些 2.每种算法的使用场景 3.基于垃圾 ...
- java面试一日一题:java中的垃圾回收器
问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...
- java面试一日一题:讲下mysql中的索引
问题:请讲下mysql中的索引 分析:mysql中有很多索引,要对对这些索引有所掌握,还要弄清楚每种索引的本质? 回答要点: 主要从以下几点去考虑 1.索引的本质是什么 2.mysql的索引分类: 3 ...
- java面试一日一题:mysql事务是如何实现的
问题:请讲下mysql的事务是如何实现的 分析:该问题主要考察对事务的理解及实现方式: 回答要点: 主要从以下几点去考虑, 1.对事务的概念的理解? 2.事务的实现方式? 讲到mysql的事务,很快可 ...
- java面试一日一题:mysql中的自增主键
问题:请讲下mysql中的自增主键 分析:该问题主要考察对mysql中自增主键的掌握,使用场景及如何设置 回答要点: 主要从以下几点去考虑 1.什么自增主键 2.使用场景是什么: 3.innodb_a ...
- java面试一日一题:binlog undolog redolog的区别
问题:请讲下mysql中binlog.undolog.redolog三种日志的区别 分析:mysql中这三种日志很常见,也是面试中涉及比较多的方面,要理解清楚这三种日志的定位及区别: 回答要点: 主要 ...
随机推荐
- C# ref and out
相同点: 1. ref 和 out 都是按地址传递的,使用后都将改变原来参数的数值: 2. 方法定义和调用方法都必须显式使用 ref 或者 out关键字: 3. 通过ref 和 ref 特性,一定程度 ...
- [个人总结]pytorch中model.eval()会对哪些函数有影响?
来源于知乎:pytorch中model.eval()会对哪些函数有影响? - 蔺笑天的回答 - 知乎 https://www.zhihu.com/question/363144860/answer/9 ...
- MySQL基本指令3 和 索引 、分页
1视图: -创建 create view 视图名称 as SQL ps:虚拟 -修改 alter view 视图名称 as SQL -删除 drop view 视图名称 2触发器 3自定义函 ...
- flex布局个人总结
<html> <div class="box1"> <span>1</span> <span>2</span> ...
- NIO三大组件之Buffer
什么是Buffer Buffer(这里并不是特指Buffer类)是一个存储数据的容器,与数组类似(其实底层依旧是用数组的结构来存储数据),但不同的是,Buffer对象提供了一组更有效的方法去进行写入和 ...
- HDU_5414 CRB and String 【字符串】
一.题目 CRB and String 二.分析 对于这题,读懂题意非常重要. 题目的意思是在$s$的基础上,按题目中所描述的步骤,即在$s$中任意选择一个字符$c$,在这个字符后面添加一个不等于$c ...
- Flutter 改善套娃地狱问题(仿喜马拉雅PC页面举例)
前言 这篇文章是我一直以来很想写的一篇文章,终于下定决心动笔了. 写Flutter的小伙伴可能都感受到了:掘金的一些热门的Flutter文章下,知乎的一些Flutter的话题下或者一些论坛里面,喷Fl ...
- python-类的多态的理解
了解多态 多态指的是一类事物有多种形态 .定义:多态是一中使用对象的方式,更容易编写出通用的代码,做出通用的编程,一适应需求的不断变化 实现步骤: 1.定义父类,并提供公共方法 2.定义子类,并重写父 ...
- ResNet的个人总结
ResNet可以说是我认真读过的第一篇paper,据师兄说读起来比较简单,没有复杂的数学公式,不过作为经典的网络结构还是有很多细节值得深究的.因为平时不太读英文文献,所以其实读的时候也有很多地方不是很 ...
- JSP配置虚拟路径及虚拟主机
1.tomact解压后目录 bin:可执行文件(startup.bat shutdown.bat) conf:配置文件(server.xml) lib:tomcat以来的jar文件 log:日志文 ...