基本定义(也是来自网络)

当某个事务a范围查询数据时,另一个事务b在该范围内插入了数据,当事务a再次范围查询时,会产生幻行(即多了事务b插入的那行数据)。

网络上的其他定义

看看幻读的正确理解

时间点

事务A

事务B

1

开启事务

2

开启事务

3

查询数据“张三”,不存在

4

插入数据“张三”

5

提交事务

6

查询数据“张三”,不存在

7

插入数据“张三”,不成功

事务A查询“张三”,查询不到,插入又不成功,“张三”这条数据就像幻觉一样出现。这就是所谓的“幻读”。网上对“幻读”还是其他的解释,都是错误的。比如像“幻读”和“不可重复读”是一样,只不过“幻读”是针对数据的个数。这些理解都是错误的。

参考链接:MySQL中的幻读,你真的理解吗? - 云+社区 - 腾讯云

详解

先说结论:【基本定义】的理解是对的,【网络上的其他定义】是不准确的。

1. 幻读是repeatble read隔离级别下的产物,但并不是repeatble read隔离级别应该有的现象。按照隔离级别的定义,重复读一定是相同的结果。

2. 那为啥会产生幻读呢?是mysql等数据库一开始在范围查询时,没有加范围锁。其他事务b可以在事务a的处理过程中在范围内插入新纪录。(数据库未能完全实现repeatble read隔离,导致了幻读现象)

3. 解决幻读的措施:众所周知的mvcc机制。

4. 解决幻读的另一个措施:next-key锁(范围加锁)。

参考链接:MySQL :: MySQL 8.0 Reference Manual :: 15.7.4 Phantom Rows

为啥会出现网络上的其他定义

mysql的 mvcc实现,会隐含的给数据表加上两个版本控制列。

它的insert操作,插入数据的同时,会写入版本号。

它的update操作,其实是插入了一条新的数据,同时更新了新老数据的版本号。

所以会导致以下情况:

1. 事务a查询数据1(空)-》事务b插入数据1-》事务a查询数据1(空)-》事务a插入数据1(失败)。这非常正常!已经有数据1了,凭什么事务a要插入成功?它并不是幻读

2.  事务a查询数据1(空)-》事务b插入数据1-》事务a查询数据1(空)-》事务a更新数据1(成功)-》事务a查询数据1(有数据)。这也很正常,因为update其实是一个insert操作,它的版本号已经更新了,为啥不能读到。它也不是幻读。

总的来说,那些错误的定义,描述的是mysql解决幻读后出现的现象,并不是幻读本身。查找了很多博客,发现幻读真的是众说纷纭,最后找到的是mysql官网的解释,加上mysql的mvcc版本号机制,推测了部分错误定义的来源,也不一定对,仅供参考。

幻读(phantom read)详解相关推荐

  1. mysql讲事物写到数据库_CookBook/1-MySQL数据库读写锁示例详解、事务隔离级别示例详解.md at master · Byron4j/CookBook · GitHub...

    MySQL数据库读写锁示例详解.事务隔离级别示例详解 锁 性能分:乐观(比如使用version字段比对,无需等待).悲观(需要等待其他事务) 乐观锁,如它的名字那样,总是认为别人不会去修改,只有在提交 ...

  2. 银联IC卡读卡流程详解--读卡器与卡交互指令

    最近因研究了下银联借记/贷记应用卡片规范,发现网上可参考资源较少,于是萌生了写下这篇文字的想法,希望可以帮助到有需要的兄弟姐妹,有描述不清晰或者有错误的地方欢迎指正. 下面进入正题,测试使用的卡是招商 ...

  3. 【C++快读快输详解(快速读入数字,快速输出数字)】

    众所周知,C++自带读入(废话),如 int a; cin>>a; 这个读入简单方便,但到后面,读的东西多了,读的也就显得慢些,所以有了下面的方式 int a; scanf("% ...

  4. Windows7中Prefetch预读文件技术详解

    大家都知道,Windows系统有种预读文件的缓存机制,让过去打开过的程序.服务再次打开时更快捷.WindowsXP中采用了这个Prefetch技术,每次在电脑里面存入.pf文件,它包含了应用程序加载的 ...

  5. java 可重入读写锁 ReentrantReadWriteLock 详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt206 读写锁 ReadWriteLock读写锁维护了一对相关的锁,一个用于只 ...

  6. java读写锁死锁例子_Java并发关于重入锁与读写锁的详解

    这篇文章主要介绍了Java并发编程之重入锁与读写锁,文中相关实例代码详细,测试可用,具有一定参考价值,需要的朋友可以了解下. 重入锁 重入锁,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对 ...

  7. 上海大学计算机专硕学制,上海大学一月专硕在职读研学制详解

    上海大学截止2015年7月,学校有专任教师2824人,其中教授577人.副教授924人,博士生导师430人,具有博士学位的教师1679人.那么,上海大学一月专硕在职读研学制是什么 很多在职研究生想尽快 ...

  8. python槽格式里填啥_python 文件读与写详解

    importsys,time '''#文件句柄f = open("yesterday2",'a',encoding="utf-8")#'r'=read,'w'= ...

  9. 读写锁(ReentranReadWriteLock))详解

    基本介绍 ReadWriteLock同Lock一样也是一个接口,提供了readLock和writeLock两种锁的操作机制,一个是只读的锁,一个是写锁.ReentranReadWriteLock是其实 ...

  10. 读EasyPR开发详解实践感想1

    实习期间看到了EasyPR这篇文章,作者写的特别详细,无论讲解还是代码,都可以说是业界良心,在此附上链接:EasyPR 看到之后就想这么详细的教程,不自己亲自实践一下简直浪费,于是乎,结合自己正在做的 ...

最新文章

  1. C++中引用的用法和应用实例
  2. linux中cp:overwrite提示的问题
  3. boost::multiprecision模块实现安全素数的测试程序
  4. java部分服务出现异常_Java web service 异常
  5. HDU 3486 Interviewe RMQ
  6. 前端学习(1892)vue之电商管理系统电商系统之为表格添加索引列
  7. N皇后问题位运算符解法【转载】
  8. spring容器_Spring容器文档阅读要点记录
  9. python 菜鸟-Python3 集合
  10. Eclipse自动排版快捷键失效(转)
  11. SpringBoot Maven repackage failed: Unable to find a single main class from the following candidates
  12. 数据机房温湿度检测物联网以太网传感器解决方案
  13. python中三角函数运算符_Python入门之三角函数sin()函数实例详解
  14. 加州大学计算机系统,盘点:美国加州大学系统值得申请的专业
  15. 网站服务器日志包含什么,查看网站日志有什么作用?
  16. 电脑出现0xv0000225无法开机的两种解决方法
  17. 少儿编程c语言 难度,c语言很难学吗
  18. Excel 2010 SQL应用105 域聚合函数之第一个和最后一个
  19. 蓝本蓝科技:私域运营为什么要做会员?会员体系的优势?
  20. 使用Amazon SNS,发邮件

热门文章

  1. HTTP头相关的材料
  2. 富爸爸财务自由之路——财富自由之路的七个步骤
  3. 笔记本电脑的S0-S5的状态
  4. 酷狗社招面试 java_酷狗面试经验
  5. tensorflow标签向量化
  6. 2019华为勇敢星实习
  7. 现实世界充满了bug_现实世界充满了哪些bug
  8. 服务器修改系统盘符,服务器盘符怎么改
  9. 微信小程序 滚动列表(无限滚动)
  10. docker构建hadoop镜像、docker-compose启动hdfs