你未必清楚什么是MySQL的幻读

栏目: 数据库 · 发布时间: 6年前

内容简介:对于"MySQL的幻读",今天发现网上有3篇文章的解释类似如下的逻辑:执行过程类似:相信会有更多的文章是这么介绍的,那么就会影响不少读者,如果你也是这么理解幻读的,建议看完下面的部分 。

对于"MySQL的幻读",今天发现网上有3篇文章的解释类似如下的逻辑:

在一个事务的两次查询中数据结果集不一致。

例如A事务select得到3行数据,而B事务却在此时插入了一行新的数据,A事务再次select,发现多了一行数据。

执行过程类似:

你未必清楚什么是 <a href='https://www.codercto.com/topics/18746.html'>MySQL</a> 的幻读

相信会有更多的文章是这么介绍的,那么就会影响不少读者,如果你也是这么理解幻读的,建议看完下面的部分 。

我们知道MySQL的默认隔离级别为 可重复读 ,这个级别是无法解决幻读问题的,我们在MySQL5.7中验证一下上面的说法。

测试准备

  • MySQL 5.7

  • 准备一张表 user(id,name)

  • 准备2条测试数据

你未必清楚什么是MySQL的幻读
你未必清楚什么是MySQL的幻读

测试过程

(1)窗口1开启事务

mysql> start transaction with consistent snapshot;
Query OK, 0 rows affected (0.01 sec)

(2)窗口2开启事务

mysql> start transaction with consistent snapshot;
Query OK, 0 rows affected (0.01 sec)

(3)窗口1查询

mysql> select * from user where id<5;
+----+-------+
| id | name |
+----+-------+
|
1 | gates |
| 2 | dell |
+----+-------+
2 rows in set (0.01 sec)

结果为2条数据。

(4)窗口2插入

mysql> insert into user values(3,'dong');
Query OK, 1 row affected (0.01 sec)

mysql> select * from user;
+----+-------+
| id | name |
+----+-------+
|
1 | gates |
| 2 | dell |
|
3 | dong |
+----+-------+
3 rows in set (0.01 sec)

(5)窗口2提交

mysql> commit;
Query OK, 0 rows affected (0.01 sec)

(6)窗口1查询

mysql> mysql> select * from user where id<5;
+----+-------+
| id | name |
+----+-------+
|
1 | gates |
| 2 | dell |
+----+-------+
2 rows in set (0.01 sec)

发现查询到的结果还是之前所看到的2条,并没有看到窗口2新插入的数据。

结论:通过上面的验证过程,可以发现幻读并不是开头说明的那样,事务1中2次select得到的结果集合是一样的,没有查出事务2新增的数据。

幻读的实际情况

幻读不是两次读取的结果集不同,是某一次 select 得到的数据状态无法正确支持后续的操作。

例如 select 某记录不存在,准备插入此记录,但执行 insert 时报错,说此条记录已经有了,无法插入,此时就发生了幻读;

或者 select 得到1条记录,然后 update,结果却更新了2条。

接着上面的示例实验:

(1)两个窗口开启事务

mysql> start transaction with consistent snapshot;

(2)窗口2插入数据

mysql> insert into user values(4,'qiang');
Query OK, 1 row affected (0.01 sec)

(3)窗口1查询id=4的记录

mysql> select * from user where id=4;
Empty set (0.01 sec)

(4)窗口1插入id=4的记录

mysql> insert into user values(4,'qiang');
ERROR 1062 (23000): Duplicate entry '4' for key 'PRIMARY'

窗口1中查询不到 id=4 的记录,但无法插入,说已经有了,这就是产生了幻读。

上面就是对幻读的解释,希望对您有所帮助,有问题欢迎交流。

点击:point_down: 阅读原文 ,查看 文章列表


以上所述就是小编给大家介绍的《你未必清楚什么是MySQL的幻读》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Lean Startup

The Lean Startup

Eric Ries / Crown Business / 2011-9-13 / USD 26.00

更多中文介绍:http://huing.com Most startups fail. But many of those failures are preventable. The Lean Startup is a new approach being adopted across the globe, chan ging the way companies are built and ......一起来看看 《The Lean Startup》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具