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中这三种日志很常见,也是面试中涉及比较多的方面,要理解清楚这三种日志的定位及区别: 回答要点: 主要 ...
随机推荐
- 「NGK每日快讯」12.4日NGK公链第31期官方快讯!
- ubuntu无法连接有线网
问题描述: ubuntu下仅能连接无线网,不能连接有线网,在有线网的下面是没有选项可供连接. 解决方法: 编辑 /etc/network/interfaces 这个文件 将里面仅仅写两句话 auto ...
- node初体验(二)
1.静态资源访问,需要设置路由和响应标头 2.url模块.path模块.querystring模块 Url { protocol: null, slashes: null, auth: null, h ...
- 自己的Scrapy框架学习之路
开始自己的Scrapy 框架学习之路. 一.Scrapy安装介绍 参考网上资料,先进行安装 使用pip来安装Scrapy 在开始菜单打开cmd命令行窗口执行如下命令即可 pip install Scr ...
- JUC学习
JUC是java.util.concurrent包 并发编程的工具包 并发.并行 并发:多线程操作一个资源 并行:多人一起走 并发编程的本质:充分利用cpu的资源 线程的几个状态 新建 运行 堵塞 等 ...
- SpringBoot读取资源目录下的文件
需要读取resources目录下的文件,那么方法如下: 假设在资源目录下的template目录下有一个文件a.txt,获取到文件流的方式 InputStream stream = this.getCl ...
- oracle check datapump jobs
reference: https://asktom.oracle.com/pls/apex/asktom.search?tag=getting-ora-31626-job-does-not-exist ...
- 你们一般都是怎么进行SQL调优的?MySQL在执行时是如何选择索引的?
前言 过年回来的第二周了,终于有时间继续总结知识了.这次来看一下SQL调优的知识,这类问题基本上面试的时候都会被问到,无论你的岗位是后端,运维,测试等等. 像本文标题中的两个问题,就是我在实际面试过程 ...
- 后端程序员之路 3、fastcgi、fastcgi++
CGI与FastCGI - wanghetao - 博客园http://www.cnblogs.com/wanghetao/p/3934350.html eddic/fastcgipp: A C++ ...
- 一次Ubuntu16.04 虚拟机挂起,ping不到网络引发的思考
虚拟机挂起 无网络 情况复现 can@ubuntu:~$ ping www.baidu.com ping: unknown host www.baidu.com 挂起重开虚拟机,遇到无网络状态: 首先 ...