MySQL 是如何解决幻读的

一、什么是幻读

在一次事务里面,多次查询之后,结果集的个数不一致的情况叫做幻读。

而多出来或者少的哪一行被叫做 幻行

二、为什么要解决幻读

在高并发数据库系统中,需要保证事务与事务之间的隔离性,还有事务本身的一致性。

三、MySQL 是如何解决幻读的

如果你看到了这篇文章,那么我会默认你了解了 脏读不可重复读可重复读

1. 多版本并发控制(MVCC)(快照读/一致性读)

多数数据库都实现了多版本并发控制,并且都是靠保存数据快照来实现的。

InnoDB 为例,每一行中都冗余了两个字断。一个是行的创建版本,一个是行的删除(过期)版本。

具体的版本号(trx_id)存在 information_schema.INNODB_TRX 表中。

版本号(trx_id)随着每次事务的开启自增。

事务每次取数据的时候都会取创建版本小于当前事务版本的数据,以及过期版本大于当前版本的数据。

普通的 select 就是快照读。

select * from T where number = 1;

原理:将历史数据存一份快照,所以其他事务增加与删除数据,对于当前事务来说是不可见的。

2. next-key 锁 (当前读)

next-key 锁包含两部分

  • 记录锁(行锁)
  • 间隙锁

记录锁是加在索引上的锁,间隙锁是加在索引之间的。(思考:如果列上没有索引会发生什么?)

select * from T where number = 1 for update;
select * from T where number = 1 lock in share mode;
insert
update
delete

原理:将当前数据行与上一条数据和下一条数据之间的间隙锁定,保证此范围内读取的数据是一致的。

其他:MySQL InnoDB 引擎 RR 隔离级别是否解决了幻读

引用一个 github 上面的评论 地址:

Mysql官方给出的幻读解释是:只要在一个事务中,第二次select多出了row就算幻读。
a事务先select,b事务insert确实会加一个gap锁,但是如果b事务commit,这个gap锁就会释放(释放后a事务可以随意dml操作),a事务再select出来的结果在MVCC下还和第一次select一样,接着a事务不加条件地update,这个update会作用在所有行上(包括b事务新加的),a事务再次select就会出现b事务中的新行,并且这个新行已经被update修改了,实测在RR级别下确实如此。

如果这样理解的话,Mysql的RR级别确实防不住幻读

有道友回复 地址:

在快照读读情况下,mysql通过mvcc来避免幻读。
在当前读读情况下,mysql通过next-key来避免幻读。
select * from t where a=1;属于快照读
select * from t where a=1 lock in share mode;属于当前读

不能把快照读和当前读得到的结果不一样这种情况认为是幻读,这是两种不同的使用。所以我认为mysql的rr级别是解决了幻读的。

先说结论,MySQL 存储引擎 InnoDB 隔离级别 RR 解决了幻读问题。

如引用一问题所说,T1 select 之后 update,会将 T2 中 insert 的数据一起更新,那么认为多出来一行,所以防不住幻读。看着说法无懈可击,但是其实是错误的,InnoDB 中设置了 快照读 和 当前读 两种模式,如果只有快照读,那么自然没有幻读问题,但是如果将语句提升到当前读,那么 T1 在 select 的时候需要用如下语法: select * from t for update (lock in share mode) 进入当前读,那么自然没有 T2 可以插入数据这一回事儿了。

注意

  1. next-key 固然很好的解决了幻读问题,但是还是遵循一般的定律,隔离级别越高,并发越低。

转载于:https://www.cnblogs.com/wdy1184/p/10655180.html

MySQL 是如何解决幻读的相关推荐

  1. mysql 什么是幻读_何为幻读?MySQL又是如何解决幻读的?

    一.什么是幻读 在一次事务里面,多次查询之后,查询的结果集的个数不一致的情况叫做幻读.而多出来或者少的哪一行被叫做 幻行 二.为什么要解决幻读 在高并发数据库系统中,需要保证事务与事务之间的隔离性,还 ...

  2. MySQL是怎么解决幻读问题的?

    问题分析 首先幻读是什么? 根据MySQL文档上面的定义 The so-called phantom problem occurs within a transaction when the same ...

  3. 灵魂拷问,MySQL到底能否解决幻读问题

    先说结论,MySQL 存储引擎 InnoDB 在可重复读(RR)隔离级别下是解决了幻读问题的. 方法:是通过next-key lock在当前读事务开启时,1.给涉及到的行加写锁(行锁)防止写操作:2. ...

  4. MySQL是如何解决幻读

    前言 事务的隔离级别有四种,读未提交,读已提交,可重复读和串行化,下面结合具体的问题,在mysql中innodb引擎是怎么解决幻读的? 一.相关问题 1.什么是幻读 幻读:一次事务里,多次查询后,结果 ...

  5. mysql什么场景下要防止幻读_灵魂拷问,MySQL到底能否解决幻读问题

    先说结论,MySQL 存储引擎 InnoDB 在可重复读(RR)隔离级别下是解决了幻读问题的. 方法:是通过next-key lock在当前读事务开启时,1.给涉及到的行加写锁(行锁)防止写操作:2. ...

  6. MySql是怎么解决幻读的。

    首先幻读是什么? 根据MySQL文档上面的定义 The so-called phantom problem occurs within a transaction when the same quer ...

  7. MySQL InnoDB如何解决幻读?

    1 数据准备 CREATE TABLE `t` (`id` int(11) NOT NULL,`c` int(11) DEFAULT NULL,`d` int(11) DEFAULT NULL,PRI ...

  8. 面试官:MySQL是如何解决幻读的?

    介绍 众所周知,在不同隔离级别下,会发生如下问题. √ 为会发生,×为不会发生 隔离级别 脏读 不可重复读 幻读 read uncommitted(未提交读) √ √ √ read committed ...

  9. MySQL 到底是怎么解决幻读的?

    作者:LastSun https://www.cnblogs.com/wdy1184/p/10655180.html 一.什么是幻读 在一次事务里面,多次查询之后,结果集的个数不一致的情况叫做幻读.而 ...

  10. mysql脏读,幻读,不可重复读以及间隙所解决幻读

    1.数据脏读 事务a修改了某条数据,然后事务b读取了事务a修改的该条数据,然后事务a由于某些原因,事务a回滚了,这样事务b读到的数据就和回滚的数据不同了,这时事务b读取的数据就是脏数据.概况一句话就是 ...

最新文章

  1. C++排序算法实现(更新中)
  2. java 文件读取 进度_读取文本文件时如何使用Java进度栏?
  3. 使用iso文件安装双系统linux,Win7下使用EasyBcd安装Ubuntu(iso文件)双系统
  4. c语言五子棋坐标覆盖,跪求C语言五子棋悔棋部分实现
  5. 计算机会碰见的英语单词SUPER
  6. go build不从本地gopath获取_跟我一起学习go语言,包依赖管理工具go mod
  7. 文字溢出时,实现在末尾显示三个点省略效果
  8. 东北师范大学计算机研究生拟录取名单,东北师范大学2016年硕士研究生拟录取名单公示...
  9. win7系统备份还原软件_十分不错的系统还原工具 一键还原备份系统软件 一键还原备份SGIMINI4.0通用版本...
  10. HTML——简单的网站首页
  11. 计算机做word的表格,word表格制作,详细教您word如何制作表格
  12. 编程猫平台 python-编程猫发布高中新课标产品 助力中小学python教育
  13. ORA-1652 无法扩展TEMP表空间
  14. java 32位兼容_Java 32位与64位兼容性
  15. Cloudera Manager环境搭建【二】
  16. 如何将自己的电脑变成WiFi热点
  17. 【译】css动画里的steps()用法详解
  18. Datawhale组队学习周报(第028周)
  19. excel单元格下拉选项怎么设置_使用Excel制作搜索式下拉菜单,让你不再烦恼下拉选项多内容...
  20. python 笛卡尔_Python实现求笛卡尔乘积的方法

热门文章

  1. 怎么通俗简洁地解释「云端」和「云计算」?
  2. RS特性总结(思维导图)
  3. CICD详解(七)——git、gitlab与github
  4. 2018上海大学生网络安全赛 misc 92 wp
  5. Scala笔记整理(二):Scala数据结构—数组、map与tuple
  6. Windows Server 2008 Active Directory建置實務(附CD)
  7. 深入理解Git (三) - 微命令上篇
  8. TZOJ 1072: 编辑距离(动态规划)
  9. 加密解密技术基础、PKI及创建私有CA
  10. video标签:以视频为背景的网页