一、什么是幻读

在一次事务里面,多次查询之后,查询的结果集的个数不一致的情况叫做幻读。而多出来或者少的哪一行被叫做 幻行

二、为什么要解决幻读

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

三、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 into T values (...)

update T set number=''

delete from T where ...

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

其他: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 可以插入数据这一回事儿了。

注意

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

学习转载在:https://www.cnblogs.com/wdy1184/p/10655180.html

mysql 什么是幻读_何为幻读?MySQL又是如何解决幻读的?相关推荐

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

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

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

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

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

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

  4. mysql 并没有幻读_MySQL默认隔离级别REPEATABLE-READ并没有解决幻读问题

    刷脉脉,发现一个帖子讨论幻读问题: https://maimai.cn/web/gossip_detail?src=app&webid=eyJhbGciOiJIUzI1NiIsInR5cCI6 ...

  5. mysql 事务值被改变_面试被问MySQL 事务的实现原理,怎么破?

    Java面试笔试面经.Java技术每天学习一点 作者:小小木的博客 来源:https://www.cnblogs.com/wyc1994666/ 开篇 相信大家都用过事务以及了解他的特点,如原子性(A ...

  6. mysql使用已有的数据库_使用SQL操作MySQL数据库

    用SHOW显示已有的数据库 句法:SHOW DATABASES [LIKE wild] 如果使用LIKE wild部分,wild字符串可以是一个使用SQL的"%"和"_& ...

  7. mysql更新一条语句_讲讲一条MySQL更新语句是怎么执行的?

    这是在网上找到的一张流程图,写的比较好,大家可以先看图,然后看详细阅读下面的各个步骤. 执行流程: 1.连接验证及解析 客户端与MySQL Server建立连接,发送语句给MySQL Server,接 ...

  8. gcc编译器和mysql源码哪个难_源码编译mysql 5.5

    http://blog.csdn.net/aidenliu/article/details/6586610 源码编译mysql 5.5+ 安装过程全记录 分类: Mysql 2011-07-05 21 ...

  9. mysql安装check requirements出错_精心整理的mysql主从监控脚本,值得收藏

    概述 分享下最近整理的一个mysql主从监控脚本,仅供参考. 一.邮件配置 1.安装邮件服务 yum -y install sendmail mailx 2.修改配置 # vi /etc/mail.r ...

最新文章

  1. 封装设置属性,一家人都要整整齐齐系列(1) JAVA泛型的实现原理
  2. 用ajax替换html代码,替换Ajax响应一个div的内部HTML(Replace inner HTML of a div w
  3. 数论 —— 高次同余方程与 BSGS 算法
  4. 盐城计算机中专学校,盐城市有哪些中专学校?
  5. html如何让图片背景透明,html – 如何让我的网站的背景透明,而不使内容(图像和文字)也是透明的?...
  6. 有哪些讽刺性极强的文案?
  7. python实践项目(五)
  8. Android开发中Ant命令编译和APK签名的一些心得
  9. 【深度学习】CNN算法
  10. 以太网帧的目的地址从哪里来?
  11. 新时达系统服务器怎么看故障,新时达系统故障详解:38故障
  12. 【基于狂神Docker双响曲】:1、Docker入门及常用部署
  13. 修改/忘记数据库密码
  14. 计算机怎么重装win7,如何重装电脑系统win7,最新电脑重装系统教程
  15. Chrome OS与Windows
  16. 海思篇之开机logo的加载(Hi3531a命令版)
  17. 用计算机进行计算ppt,用计算器进行计算精要.ppt
  18. BMZCTF(泰湖杯-MISC)
  19. 背单词学英语20年经验总结
  20. MySql5.6.51 免安装版下载配置

热门文章

  1. 加密解密工具 之 波利比奥斯方阵密码
  2. 计算机的收获初一作文,写收获的初一作文五篇
  3. Unity随记(七) shader实现石像石化效果
  4. 大学生可以选择加盟零食店么
  5. 离不开的办公文档——OFFICE,OFFICE大客户版本安装部署
  6. 视觉SLAM十四讲第八讲
  7. 阿里服务器部署及区块链币种同步
  8. 分享个“软件开发需求文档”
  9. 自动化测试—业务线仿真回归流程剖析
  10. 三菱FX3U与台达VFD M变频器通讯教程