mysql可重复读不能解决幻读吗?

1、可重复读和幻读的概念

1.1、可重复读

可重复读是数据库的四个隔离级别之一,可重复读可以保证在一个事物之内读取到的数据永远是相同的(通过mvcc表快照实现的),哪怕这期间有其它事务对数据做了修改,也不会影响当前事务的查询。

1.2、幻读

网上有不少博客说:幻读是一个事物内多次查询得到的数据结果不一样。比如说select (1)这种查询,如果有其它事务增加或删除了数据,会影响到当前事务的select (1)。这种说法是错误的,因为可重复读隔离级别下,这种情况就不会出现,后面会有实际操作。

我认为的幻读是一个事务内,比如执行查询select * from test where id = 3 没有查出来数据,然后接着执行insert操作INSERT INTO test (id) values (3),可能会因为其它事务先一步插入了id为3的数据,导致当前事务插入数据失败。这种情况是可能会出现的,可重复读解决不了这种问题。

2、实操

以此表为例,表里只有主键id字段,只有两条数据。

开启事务,查询id为3的数据

会查询不到,再开启一个事务,插入id为3的数据。

操作成功,表里已经有了id为3的数据了

但是之前的第一个事务由于是在插入id为3的事务之前开启的,所以第一个事务是查询不到id为3的数据的。

下面复刻幻读,给第一个事务也执行插入id为3的数据。

可以看到,报错了。因为id为3的数据已经被其他事务插入了。这就是我理解的可重复读无法解决的幻读。

这也是我面试喜欢问的一个问题,在一个事务内对同一个查询执行两次,查询出来的结果肯定会一样吗?我想现在大家心里应该有答案了吧。

相关推荐
老虎0627几秒前
Netty[ NIO 核心速成 ] ---- NIO三大组件(Channel & Buffer&selector)
java·github·nio
Oueii3 分钟前
如何为开源Python项目做贡献?
jvm·数据库·python
小王不爱笑1328 分钟前
Java 异常全解析:从原理到实战,搞定异常处理
java·开发语言
人工智能AI技术12 分钟前
Spring Boot 3.5正式普及!Java虚拟线程+GraalVM原生镜像,启动仅0.3秒
java
代码派18 分钟前
免费本地部署的数据库 DevOps 工具,能覆盖多少日常工作场景?以 NineData 社区版为例
运维·数据库·database·devops·数据库管理工具·数据管理·sql工具
2401_8914821719 分钟前
Python Web爬虫入门:使用Requests和BeautifulSoup
jvm·数据库·python
没有bug.的程序员22 分钟前
撕裂微服务网关的认证风暴:Spring Security 6.1 与 JWT 物理级免登架构大重构
java·spring·微服务·架构·security·jwt
小王不爱笑13225 分钟前
Java Set 集合全家桶:HashSet、LinkedHashSet、TreeSet 详解与实战
java·开发语言
杨过姑父26 分钟前
java 面试,jvm笔记
java·jvm·面试
成为你的宁宁31 分钟前
【Dockerfile 实战:基于 Ubuntu/CentOS 镜像构建 MySQL 8.4自定义镜像】
mysql·ubuntu·centos·dockerfile