【Java面试】这应该是面试官最想听到的回答,Mysql如何解决幻读问题?
“Mysql如何解决幻读问题”
一个工作了4年小伙伴,去一个美团面试,遇到了这样一个问题。
大家好,我是Mic,一个工作了14年的Java程序员
关于这个问题,面试官想考察什么?我们应该如何回答呢?
问题解析
这个问题至少考察的是3年以上开发经验的同学。
Mysql底层去解决并发事务问题,至少是要有一定的技术积累才能真正理解。
而如果作为一个刚工作没多久的程序员,必须要知道数据库的事务隔离级别的问题。
因为不同的隔离级别对于数据的安全性影响是不同的。
也就是存在脏读、幻读、不可重复读等问题。
所谓幻读,就是一个事务前后两次读取到的数据条数不一致。
在第一个事务里面执行一个范围查询,这个时候满足查询的数据只有一条。
接着第二个事务里面插入一条数据并且提交了,然后在第一个事务里面再次查询的时候发现有两条数据满足条件。

在RR事务隔离级别下,引入了MVCC和LBCC这两种方式来解决幻读问题。
MVCC类似于一种乐观锁的设计,简单来说就是针对每个事务生成一个事务版本,然后针对这个版本定义了访问规则
一个事务只能看到第一次查询之前已经提交的事务以及当前事务的修改。
一个事务不能看到当前事务第一次查询之后创建的事务,以及未提交的事务修改。
但是,如果在一个事务里面存在当前读的情况下,MVCC还是会存在幻读问题,因为当前读不是读快照,而是直接读内存。
所以针对这种情况,可以使用LBCC也就是基于锁的机制来解决,也就是常说的行锁、表锁、间隙锁等
基于对上述知识的理解,如果没有对Mysql不同事务隔离级别的底层实现原理有一个清晰认识的同学在回答这个问题的时候,要么就是很生硬,要么就是无法扩展,就会显得有点像是在背答案。
下面看看高手是怎么回答这个问题的吧。
高手:
在RR(也就是可重复读)的事务隔离级别下,InnoDB采用了MVCC机制来解决幻读问题。
MVCC就是一种乐观锁的机制,它通过对不同事务生成不同的快照版本,通过UNDO版本链进行管理并且在MVCC里面,规定了高版本能够看到低版本的事务变更,低版本看不到高版本的事务变更从而实现了不同事务之间的数据隔离,解决了幻读的问题。
但是在当前读的情况下,是直接读取内存的数据,跳过了快照度,所以还是会出现幻读问题。
我认为可以通过两个方式来解决。
- 第一种是尽量避免当前读的情况
- 第二种是引入LBCC的方式
以上就是我对这个问题的理解。
总结
好了,今天的分享就到这里结束了
如果喜欢我的作品,记得点赞、收藏、关注!!!
需要Java面试合集,金九银十面试秘籍扫下方!
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
Mic带你学架构!
如果本篇文章对您有帮助,还请帮忙点个关注和赞,您的坚持是我不断创作的动力。欢迎关注「跟着Mic学架构」公众号公众号获取更多技术干货!

【Java面试】这应该是面试官最想听到的回答,Mysql如何解决幻读问题?的更多相关文章
- 【面试普通人VS高手系列】innoDB如何解决幻读
前天有个去快手面试的小伙伴私信我,他遇到了这样一个问题: "InnoDB如何解决幻读"? 这个问题确实不是很好回答,在实际应用中,很多同学几乎都不关注数据库的事务隔离性. 所有问题 ...
- 【大厂面试03期】MySQL是怎么解决幻读问题的?
问题分析 首先幻读是什么? 根据MySQL文档上面的定义 The so-called phantom problem occurs within a transaction when the same ...
- Get与Post的区别?(面试官最想听到的答案)
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
- 面试官:MySQL的可重复读级别能解决幻读问题吗?
引言 之前在深入了解数据库理论的时候,了解到事务的不同隔离级别可能存在的问题.为了更好的理解所以在MySQL数据库中测试复现这些问题.关于脏读和不可重复读在相应的隔离级别下都很容易的复现了. 但是对于 ...
- 如何准备Java面试?如何把面试官的提问引导到自己准备好的范围内?
Java能力和面试能力,这是两个方面的技能,可以这样说,如果不准备,一些大神或许也能通过面试,但能力和工资有可能被低估.再仔细分析下原因,面试中问的问题,虽然在职位介绍里已经给出了范围,但针对每个点, ...
- JAVA多线程和并发基础面试问答(转载)
JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...
- [转] JAVA多线程和并发基础面试问答
JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...
- Android开发面试经——6.常见面试官提问Android题②(更新中...)
版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http://blog.csdn.net/fi ...
- Android开发面试经——5.常见面试官提问Android题①
版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客: http://blog.csdn.net/f ...
随机推荐
- 一个月后,我们又从 MySQL 双主切换成了主 - 从!
这是悟空的第 157 篇原创文章 官网:www.passjava.cn 你好,我是悟空. 一.遇到的坑 一个月前,我们在测试环境部署了一套 MySQL 高可用架构,也就是 MySQL 双主 + Kee ...
- Linux综合运用
一. Linux用户和组及其权限管理 请根据以下项目要求,写出操作过程和命令并进行相应的验证测试操作. 项目要求: 某软件开发公司即将开始在Linux系统上进行项目的开发.要实现的环境是:公司有软件开 ...
- fpga中的存储器
fpga中的存储器三种:RAM,ROM,FIFO. RAM和ROM已经比较熟悉了,记录一下FIFO. FIFO:first in first out ,顺序存取,先入先出.是一种数据缓存器,用来作不同 ...
- javaweb 02: servlet
Servlet对象的生命周期 什么是Servlet对象生命周期? Servlet对象什么时候被创建. Servlet对象什么时候被销毁. Servlet对象创建了几个? Servlet对象的生命周期表 ...
- 常用的函数式接口_Supplier和常用的函数式接口Supplier接口练习_求数组中元素最大值
Supplier接口 package com.yang.Test.SupplierStudy; import java.util.function.Supplier; /** * 常用的函数式接口 * ...
- Odoo14 一些好用的开源的模块
# odoo14中一些好用的开源的模块 1.intero_reload_form 刷新按钮(页面数据刷新,而不是按F5刷新整个页面) 2.ms_magic_button 弹框下拉选项 3.sessio ...
- 【freertos】013-任务通知及其实现细节
前言 参考: https://www.freertos.org/RTOS-task-notifications.html 原文:https://www.cnblogs.com/lizhuming/p/ ...
- typora的第一天
一级标题 二级标题 三级标题 ..... 表格 java spring mybatis 代码 java代码 public void Hello(){ } 字体 hello word! hello wo ...
- 一般处理程序ashx接入微信服务器配置
首先在威信后台填写服务器相关配置,这里按照说明直接填写就好了.配置提交前在需要在我们服务端先准备号接受微信请求的url,对请求内容做验证. 1.准备接口配置信息 A.服务器URL 该URL用于开发者接 ...
- 使用 Java 操作 Redis
Jedis 1. 概述 Jedis 是一款使用 Java 操作 Redis 的工具,有点类似于 JDBC 2. 引入依赖 <dependency> <groupId>redis ...