学习之前的疑问:
可重复读的概念 与 不可重复读的概念
行锁+gap锁(间隙锁)
快照读 与 当前读区别
快照读中的MVCC
当前读中的gap锁 和 行锁

前几天面试时被问到了mysql可重复读如何解决幻读的问题,之前脑子中的概念只有增加了共享锁和排他锁进行避免,没有实践或者清晰的概念,今天首先实践验证和理解mysql下可重复读对于幻读的避免和原理。参考博文:https://blog.csdn.net/Y0Q2T57s/article/details/103708206

首先整体了解数据库的隔离级别:

读未提交 -------------- 可能产生脏读,幻读,不可重复读
读已提交(不可重复读)----------------- 可能产生不可重复读,幻读
可重复读 ---------------------------------可能产生幻读
序列化 -----------------------------------无

可重复度和不可重复读

  • 概念:
  1. 不可重复读指的是事务1和事务2同时获取数据,在此时事务2进行插入行或者修改行操作,这时事务1再次进行select时会发现多了几行数据或者数据不一致,这就称为幻读
  2. 可重复读,也就是在RR隔离级别下,为了避免不可重复读的幻读情况发生,事务2修改数据的结果 在事务1是无法获取的,进行了隔离,这个实现后面会介绍到MVCC。

在了解了mysql的几个隔离级别后,针对可重复读是如何防止产生幻读的?

  • 先来通过实践验证简单的:如何防止如不可重复读的情况
    首先创建一张表
Create Table: CREATE TABLE `dept` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8

开启两个事务

表中没有数据,现在我们往右边事务中插入一条数据,如果在不可重复的隔离级别下在左边事务再select会发现新插入数据,而可重复读的情况下左边的select数据一直不变。

  • 解释:这一现象的原理是RR即可重复读的隔离级别下用到了MVCC,多版本并发控制,每个事务在开启时会有一个版本号,不管其他事务如何数据,而当前事务中的版本号不会变化,所以左边事务一直select的数据都是一个版本中的,所以不会读取到右边事务插入后的数据。
在左边事务中发现内容为空,我们插入一个id=29的数据行,看看会发生什么

  • 解释:这是什么情况呢?这是因为在select时会使用到快照读,但是在例如上面insert时会进行当前读, 如字面意思解释,快照读即事务开启时产生的版本号一般,进行了数据表当前的数据“复制”,在事务中select时只会用到快照读,但是如果进行insert/ update / select … for update 这种语句时,会进行当前读,访问数据表中“最新”的数据,这时尽管右边的insert未提交,但当前读还是会读到, 那么根据报错的信息,lock,得知在右边事务insert一行之后会进行加锁 (X锁),不允许其他事务修改,但能读取当前数据(当前读)即获取当前行的S锁,左边insert需要在右边事务释放锁之后才能进行insert/update操作(commit或者rollback)

下面对X锁和S锁进行学习

  • X锁称为排他锁(悲观锁) ----- 对目标行添加当前事务的X锁,即可修改或删除操作
  • S锁称为共享锁(共享锁) ----- 对目标行添加当前事务的S锁,即可读当前行的数据
    S锁是可以兼容的,即多个事务都可以持有对某行的读权限, 而X锁是不兼容的,即最多只有一个事务能获取当前行的修改或删除权限, 若其他事务需要获取X锁,必须等当前拥有X锁权限的事务释放X锁才能获取。

而上面出现的情况是因为 右边事务在Insert时便对id=29的行数据添加了X锁,而这时左边事务要对id=29的行进行X操作,那么首先需要获取已经被右边事务拥有的X锁,那么需要等右边事务释放X锁权限(commit或者rollback)才能获取.

  • 还有如下情况:
    如上面解释,如果右边事务插入id=99的数据行,如果左边事务修改id范围不包含99的话应该可以操作,但是左边事务也遇到了锁,导致不能修改成功,这是因为上面的X锁不仅包含了当前一行,还有(-无穷大, 10) 和 (10,+无穷大)加锁, 在左边事务update时,会遇到间隙锁(GAP锁),导致需要等待右边事务释放锁后才能更新。

通过上面可重复读中几种情况,总结:可重复读本身还是存在幻读的,但是因为在可重复读上添加了NEXE-KEY锁(即行锁+gap锁)避免了幻读的产生。

可重复读如何解决幻读相关推荐

  1. MySQL可重复读应用场景_mysql-repeatable read 可重复读隔离级别-幻读实例场景

    本文详解 repeatable read 可重复读 隔离级别产生的影响(幻读) -- SERIALIZABLE serializable 序列化 :一个个事务排成序列的形式.事务一个挨一个执行,等待前 ...

  2. 面试 | 你说你熟悉MySql,那你就来谈谈InnoDB如何解决幻读的?

    这是小小本周的第一篇. 今天干了啥 今天可是周日,一个休息日,对于休息日来说,小小本身也是比较忙碌的,忙碌的小小,耗费的很多的时间,终于倒腾完成了GitChat,一篇GitChat 将会于近日出炉.完 ...

  3. mysql 幻读 mvcc_MVCC 能解决幻读吗?

    MySQL通过MVCC(解决读写并发问题)和间隙锁(解决写写并发问题)来解决幻读 MySQL InnoDB事务的隔离级别有四级,默认是"可重复读"(REPEATABLE READ) ...

  4. oracle、mysql、sqlserver的对比数据库引擎的对比与选型InnoDB解决幻读

    1. 所属公司: MySQL是由瑞典MySQL AB公司开发,目前属于 Oracle 旗下产品: Oracle是由美国ORACLE公司(甲骨文)开发的一组核心软件产品: SqlServer是由Micr ...

  5. mysql 快照读 幻读,InnoDB的MVCC如何解决不可重复读和快照读的幻读,当前读用next-key解决幻读...

    InnoDB默认的隔离级别是RR(可重复读),可以解决脏读和不可重复读,只解决了快照读情况下的幻读问题,当前读情况下解决幻读问题得靠next-key锁. mysql如何实现避免幻读: 在快照读读情况下 ...

  6. mysql幻读和不可重复读的区别_面试官:MySQL的可重复读级别能解决幻读吗

    Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 作者:宁愿. 来源:https://juejin.im/post/5c9040e95188252d92095a9e 引言 之前 ...

  7. 不可重复读和幻读的区别_面试官:MySQL的可重复读级别能解决幻读吗

    Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 作者:宁愿. 来源:https://juejin.im/post/5c9040e95188252d92095a9e 引言 之前 ...

  8. MySQL可重复读隔离级别能解决幻读吗?

    事务及事务隔离级别 innodb存储引擎支持事务,myisam不支持事务 事务内的操作要么全部成功,要么全部失败,中途有失败则回滚 事务的ACID:原子性,一致性,隔离性,持久性 事务隔离级别需要解决 ...

  9. MySQL可重复读隔离级别为何没有解决幻读(MVCC原理简介)

    MySQL可重复读隔离级别为何没有解决幻读(MVCC原理简介) 一.MCVV简介 二.可重复读隔离级别能解决幻读? 三.什么是当前读和快照读? 四.MVCC的实现原理 五.RC,RR级别下的InnoD ...

最新文章

  1. 360董事长周鸿伟在新员工入职培训上的讲话
  2. 在JAVA中如何跳出当前的多重嵌套循环
  3. linux的程序员计算器,linux中的计算器
  4. 深度解析Cocoa异步请求和libxml2.dylib教程(1)
  5. LINUX入侵检测指导
  6. 比较标签 php,比较标签 · ThinkPHP5.0完全开发手册 · 看云
  7. boot定时任务开启和关闭 spring_Spring-Boot 下定时任务通过配置文件控制开关和执行时间...
  8. 宾州州立大学计算机本科,2020年宾州州立大学本科读几年
  9. CocoStudio基础教程(6)使用CocoStudio编辑帧事件并关联到程序
  10. 2020最全蓝牙耳机盘点:年会最值得选择的十大优秀蓝牙耳机品牌
  11. 我的spark学习之路(一)
  12. Python金融大数据分析——第11章 统计学(2)投资组合优化 笔记
  13. 静静的推荐分数 20作者 陈越单位 浙江大学
  14. 北京电信整顿“一机双号” 通信管理局要求清理原库
  15. php+mysql统计7天、30天每天数据没有补0
  16. (附源码)Springboot校园商铺系统 毕业设计 052145
  17. SEO从业者打造个人品牌的八个建议
  18. Servelet开发步骤和生命周期
  19. http的长连接 和短连接
  20. 小米回应年底裁员:事情确实有,规模没那么大;华为关闭其在俄罗斯的企业事业部|极客头条...

热门文章

  1. Android tv树莓派遥控器,树莓派的kodi设置遥控器的方法
  2. zzulioj -- 1261 : 小媛在努力
  3. 陈大佬:机器学习科研这十年
  4. 保密相册计算机,‎加密相册(新版) - 密码计算机照片保险箱 v App Storu
  5. cron表达式每个月最后一天
  6. 关于一汽大众的车型底盘号
  7. springboot 自定义filter
  8. ROC曲线和AUC指标
  9. Android EditText控制输入字符限制的方法
  10. echarts折线图改变y轴刻度