松鼠乐园 松鼠乐园
  • 注册
  • 登录
  • 首页
  • 快捷入口
    • Vue
    • Tensorflow
    • Springboot
    • 语言类
      • CSS
      • ES5
      • ES6
      • Go
      • Java
      • Javascript
    • 工具类
      • Git
      • 工具推荐
    • 服务器&运维
      • Centos
      • Docker
      • Linux
      • Mac
      • MySQL
      • Nginx
      • Redis
      • Windows
    • 资源类
      • 论文
      • 书籍推荐
      • 后端资源
      • 前端资源
      • html网页模板
      • 代码
    • 性能优化
    • 测试
  • 重大新闻
  • 人工智能
  • 开源项目
  • Vue2.0从零开始
  • 广场
首页 › MySQL › 面试问烂的MySQL四种隔离级别、看完吊打面试官

面试问烂的MySQL四种隔离级别、看完吊打面试官

迦娜王
3年前MySQL
494 0 1
Mysql的四种隔离级别
面试问烂的MySQL四种隔离级别、看完吊打面试官
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
Read Uncommitted(读取未提交内容)在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。Read Committed(读取提交内容)这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。Repeatable Read(可重读)这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。Serializable(可串行化)这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如:脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示:
面试问烂的MySQL四种隔离级别、看完吊打面试官

测试Mysql的隔离级别 下面,将利用MySQL的客户端程序,我们分别来测试一下这几种隔离级别。 测试数据库为demo,表为test;表结构:
面试问烂的MySQL四种隔离级别、看完吊打面试官
两个命令行客户端分别为A,B;不断改变A的隔离级别,在B端修改数据。 (一)、将A的隔离级别设置为read uncommitted(未提交读)
面试问烂的MySQL四种隔离级别、看完吊打面试官
A:启动事务,此时数据为初始状态
面试问烂的MySQL四种隔离级别、看完吊打面试官
B:启动事务,更新数据,但不提交
面试问烂的MySQL四种隔离级别、看完吊打面试官
A:再次读取数据,发现数据已经被修改了,这就是所谓的“脏读”
面试问烂的MySQL四种隔离级别、看完吊打面试官
B:回滚事务
面试问烂的MySQL四种隔离级别、看完吊打面试官
A:再次读数据,发现数据变回初始状态
面试问烂的MySQL四种隔离级别、看完吊打面试官
经过上面的实验可以得出结论,事务B更新了一条记录,但是没有提交,此时事务A可以查询出未提交记录。造成脏读现象。未提交读是最低的隔离级别。 (二)、将客户端A的事务隔离级别设置为read committed(已提交读)
面试问烂的MySQL四种隔离级别、看完吊打面试官
A:启动事务,此时数据为初始状态
面试问烂的MySQL四种隔离级别、看完吊打面试官
B:启动事务,更新数据,但不提交
面试问烂的MySQL四种隔离级别、看完吊打面试官
A:再次读数据,发现数据未被修改
面试问烂的MySQL四种隔离级别、看完吊打面试官
B:提交事务
面试问烂的MySQL四种隔离级别、看完吊打面试官
A:再次读取数据,发现数据已发生变化,说明B提交的修改被事务中的A读到了,这就是所谓的“不可重复读”
面试问烂的MySQL四种隔离级别、看完吊打面试官
经过上面的实验可以得出结论,已提交读隔离级别解决了脏读的问题,但是出现了不可重复读的问题,即事务A在两次查询的数据不一致,因为在两次查询之间事务B更新了一条数据。已提交读只允许读取已提交的记录,但不要求可重复读。 (三)、将A的隔离级别设置为repeatable read(可重复读)
面试问烂的MySQL四种隔离级别、看完吊打面试官
A:启动事务,此时数据为初始状态
面试问烂的MySQL四种隔离级别、看完吊打面试官
B:启动事务,更新数据,但不提交
面试问烂的MySQL四种隔离级别、看完吊打面试官
A:再次读取数据,发现数据未被修改
面试问烂的MySQL四种隔离级别、看完吊打面试官
B:提交事务
面试问烂的MySQL四种隔离级别、看完吊打面试官
A:再次读取数据,发现数据依然未发生变化,这说明这次可以重复读了
面试问烂的MySQL四种隔离级别、看完吊打面试官
B:插入一条新的数据,并提交
面试问烂的MySQL四种隔离级别、看完吊打面试官
A:再次读取数据,发现数据依然未发生变化,虽然可以重复读了,但是却发现读的不是最新数据,这就是所谓的“幻读”
面试问烂的MySQL四种隔离级别、看完吊打面试官
A:提交本次事务,再次读取数据,发现读取正常了
面试问烂的MySQL四种隔离级别、看完吊打面试官
由以上的实验可以得出结论,可重复读隔离级别只允许读取已提交记录,而且在一个事务两次读取一个记录期间,其他事务部的更新该记录。但该事务不要求与其他事务可串行化。例如,当一个事务可以找到由一个已提交事务更新的记录,但是可能产生幻读问题(注意是可能,因为数据库对隔离级别的实现有所差别)。像以上的实验,就没有出现数据幻读的问题 (四)、将A的隔离级别设置为可串行化(Serializable)
面试问烂的MySQL四种隔离级别、看完吊打面试官
A:启动事务,此时数据为初始状态
面试问烂的MySQL四种隔离级别、看完吊打面试官
B:发现B此时进入了等待状态,原因是因为A的事务尚未提交,只能等待(此时,B可能会发生等待超时)
面试问烂的MySQL四种隔离级别、看完吊打面试官
A:提交事务
面试问烂的MySQL四种隔离级别、看完吊打面试官
B:发现插入成功
面试问烂的MySQL四种隔离级别、看完吊打面试官
serializable完全锁定字段,若一个事务来查询同一份数据就必须等待,直到前一个事务完成并解除锁定为止。是完整的隔离级别,会锁定对应的数据表格,因而会有效率的问题。
mysql mysql隔离级别
1
MySQL之数据类型(列类型)
上一篇
非常全的Mysql面试题及答案
下一篇
评论 (0)

请登录以参与评论。

现在登录
聚合文章
Servicios profesionales Organizaciones
1年前
在Gitee收获近 5k Star,更新后的Vue版RuoYi有哪些新变化?
1年前
vue3.x reactive、effect、computed、watch依赖关系及实现原理
1年前
Vue 3 新特性:在 Composition API 中使用 CSS Modules
1年前
标签
AI AI项目 css docker Drone Elaticsearch es5 es6 Geometry Go gru java Javascript jenkins lstm mysql mysql优化 mysql地理位置索引 mysql索引 mysql规范 mysql设计 mysql配置文件 mysql面试题 mysql高可用 nginx Redis redis性能 rnn SpringBoot Tensorflow tensorflow2.0 UI设计 vue vue3.0 vue原理 whistle ZooKeeper 开源项目 抓包工具 日志输出 机器学习 深度学习 神经网络 论文 面试题
1
相关文章
开源的SQL查询优化工具–EverSQL
MySQL Geometry扩展在地理位置计算中的效率优势
mysql纵表转横表
分析一个叶大师的my.cnf自动生成工具
松鼠乐园

资源整合,创造价值

小伙伴
墨魇博客 无同创意
目录
重大新闻 Centos CSS Docker ES5 ES6 Go Java Javascript Linux Mac MySQL Nginx Redis Springboot Tensorflow Vue Vue2.x从零开始 Windows 书籍推荐 人工智能 前端资源 后端资源 壁纸 开源项目 测试 论文
Copyright © 2018-2022 松鼠乐园. Designed by nicetheme. 浙ICP备15039601号-4
  • 重大新闻
  • Centos
  • CSS
  • Docker
  • ES5
  • ES6
  • Go
  • Java
  • Javascript
  • Linux
  • Mac
  • MySQL
  • Nginx
  • Redis
  • Springboot
  • Tensorflow
  • Vue
  • Vue2.x从零开始
  • Windows
  • 书籍推荐
  • 人工智能
  • 前端资源
  • 后端资源
  • 壁纸
  • 开源项目
  • 测试
  • 论文
热门搜索
  • jetson nano
  • vue
  • java
  • mysql
  • 人工智能
  • 人脸识别
迦娜王
坚持才有希望
1224 文章
35 评论
242 喜欢
  • 1
  • 0
  • Top