问题:请讲下对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. ts 交集类型

    type Event = { name: string; dateCreated: string; type: string; } // error type UserEvent extends Ev ...

  2. 页面导入导出EXCEL

    引用 using Microsoft.Office.Interop.Excel;using System.Reflection;//反射命名空间using System.IO; protected v ...

  3. 代码生成器 springboot架构

    import com.baomidou.mybatisplus.annotation.DbType;import com.baomidou.mybatisplus.annotation.IdType; ...

  4. Information:java: javacTask: 源发行版 8 需要目标发行版 1.8

    原文链接:https://blog.csdn.net/idiot_qi/article/details/105149846 创建新maven项目跑main,出现这个编译异常 网上找了找,记录一下以备不 ...

  5. Docker 镜像加速教程

    原文链接:https://fuckcloudnative.io/posts/docker-registry-proxy/ 在使用 Docker 和 Kubernetes 时,我们经常需要访问 gcr. ...

  6. 优化程序性能(CSAPP)

    [前言]虽然现在没有接触过大型项目,但是工作了会注重性能.学习一下,应该能更好更快的理解别人写的经典优化的代码.结合CSAPP和自己的理解,总结一下. 一.程序优化综述 1.高效程序的特点 (1)适当 ...

  7. Java基础自学小项目

    实现一个基于文本界面的<家庭记账软件> 需求:能够记录家庭的收入,支出,并能够收支明细表 主要涉及一下知识点: - 局部变量和基本数据类型 - 循环语句 - 分支语句 - 方法调用和返回值 ...

  8. 不用代码趣讲 ZooKeeper 集群

    本文作者:HelloGitHub-老荀 Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源.有趣.入门级的 ZooKeeper 教程,面向有编程基础的新手. 项 ...

  9. nginx错误分析 `104: Connection reset by peer`

    故障描述 应用从虚拟机环境迁移到kubernetes环境中,有些应用不定时出现请求失败的情况,且应用没有记录任何日志,而在NGINX中记录502错误.我们查看了之前虚拟机中的访问情况,没有发现该问题. ...

  10. 剑指 Offer 14- II. 剪绳子 II + 贪心 + 数论 + 快速幂

    剑指 Offer 14- II. 剪绳子 II 题目链接 因为有取模的操作,动态规划中max不能用了,我们观察:正整数从1开始,但是1不能拆分成两个正整数之和,所以不能当输入. 2只能拆成 1+1,所 ...