问题:请讲下对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的理解的更多相关文章

  1. java面试一日一题:讲下mysql中的undolog

    问题:请讲下mysql中undo log的作用 分析:mysql中有很多日志,例,bin log undo log redo log,要弄清楚这些日志的作用,就要了解这些日志出现的背景及要解决的问题: ...

  2. java面试一日一题:mysql中常用的存储引擎有哪些?

    问题:请讲下mysql中常用的引擎有哪些? 分析:该问题主要考察对mysql存储引擎的理解,及区别是什么? 回答要点: 主要从以下几点去考虑, 1.mysql的存储引擎的基本概念? 2.mysql中常 ...

  3. java面试一日一题:讲下在什么情况下会发生类加载

    问题:请讲下在什么情况下会发生类加载? 分析:该问题主要考察对java中类加载的知识,什么是类加载,为什么会发生类加载,什么情况下发生类加载? 回答要点: 主要从以下几点去考虑 1.什么是类加载: 2 ...

  4. java面试一日一题:java中垃圾回收算法有哪些

    问题:请讲下在java中有哪些垃圾回收算法 分析:该问题主要考察对java中垃圾回收的算法以及使用场景 回答要点: 主要从以下几点去考虑, 1.GC回收算法有哪些 2.每种算法的使用场景 3.基于垃圾 ...

  5. java面试一日一题:java中的垃圾回收器

    问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...

  6. java面试一日一题:讲下mysql中的索引

    问题:请讲下mysql中的索引 分析:mysql中有很多索引,要对对这些索引有所掌握,还要弄清楚每种索引的本质? 回答要点: 主要从以下几点去考虑 1.索引的本质是什么 2.mysql的索引分类: 3 ...

  7. java面试一日一题:mysql事务是如何实现的

    问题:请讲下mysql的事务是如何实现的 分析:该问题主要考察对事务的理解及实现方式: 回答要点: 主要从以下几点去考虑, 1.对事务的概念的理解? 2.事务的实现方式? 讲到mysql的事务,很快可 ...

  8. java面试一日一题:mysql中的自增主键

    问题:请讲下mysql中的自增主键 分析:该问题主要考察对mysql中自增主键的掌握,使用场景及如何设置 回答要点: 主要从以下几点去考虑 1.什么自增主键 2.使用场景是什么: 3.innodb_a ...

  9. java面试一日一题:binlog undolog redolog的区别

    问题:请讲下mysql中binlog.undolog.redolog三种日志的区别 分析:mysql中这三种日志很常见,也是面试中涉及比较多的方面,要理解清楚这三种日志的定位及区别: 回答要点: 主要 ...

随机推荐

  1. C# ref and out

    相同点: 1. ref 和 out 都是按地址传递的,使用后都将改变原来参数的数值: 2. 方法定义和调用方法都必须显式使用 ref 或者 out关键字: 3. 通过ref 和 ref 特性,一定程度 ...

  2. [个人总结]pytorch中model.eval()会对哪些函数有影响?

    来源于知乎:pytorch中model.eval()会对哪些函数有影响? - 蔺笑天的回答 - 知乎 https://www.zhihu.com/question/363144860/answer/9 ...

  3. MySQL基本指令3 和 索引 、分页

    1视图: -创建  create view 视图名称 as SQL  ps:虚拟 -修改  alter view 视图名称 as SQL -删除  drop view 视图名称 2触发器  3自定义函 ...

  4. flex布局个人总结

    <html> <div class="box1"> <span>1</span> <span>2</span> ...

  5. NIO三大组件之Buffer

    什么是Buffer Buffer(这里并不是特指Buffer类)是一个存储数据的容器,与数组类似(其实底层依旧是用数组的结构来存储数据),但不同的是,Buffer对象提供了一组更有效的方法去进行写入和 ...

  6. HDU_5414 CRB and String 【字符串】

    一.题目 CRB and String 二.分析 对于这题,读懂题意非常重要. 题目的意思是在$s$的基础上,按题目中所描述的步骤,即在$s$中任意选择一个字符$c$,在这个字符后面添加一个不等于$c ...

  7. Flutter 改善套娃地狱问题(仿喜马拉雅PC页面举例)

    前言 这篇文章是我一直以来很想写的一篇文章,终于下定决心动笔了. 写Flutter的小伙伴可能都感受到了:掘金的一些热门的Flutter文章下,知乎的一些Flutter的话题下或者一些论坛里面,喷Fl ...

  8. python-类的多态的理解

    了解多态 多态指的是一类事物有多种形态 .定义:多态是一中使用对象的方式,更容易编写出通用的代码,做出通用的编程,一适应需求的不断变化 实现步骤: 1.定义父类,并提供公共方法 2.定义子类,并重写父 ...

  9. ResNet的个人总结

    ResNet可以说是我认真读过的第一篇paper,据师兄说读起来比较简单,没有复杂的数学公式,不过作为经典的网络结构还是有很多细节值得深究的.因为平时不太读英文文献,所以其实读的时候也有很多地方不是很 ...

  10. JSP配置虚拟路径及虚拟主机

    1.tomact解压后目录 bin:可执行文件(startup.bat   shutdown.bat) conf:配置文件(server.xml) lib:tomcat以来的jar文件 log:日志文 ...