MySQL的不可重复读和幻读是什么意思

58次阅读
没有评论

共计 3795 个字符,预计需要花费 10 分钟才能阅读完成。

这篇文章主要介绍“MySQL 的不可重复读和幻读是什么意思”,在日常操作中,相信很多人在 MySQL 的不可重复读和幻读是什么意思问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL 的不可重复读和幻读是什么意思”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

幻读

由于很多人容易搞混不可重复读和幻读, 这两者确实非常相似。

但不可重复读主要是说多次读取一条记录, 发现该记录中某些列值被修改过。

而幻读主要是说多次读取一个范围内的记录 (包括直接查询所有记录结果或者做聚合统计), 发现结果不一致 (标准档案一般指记录增多, 记录的减少应该也算是幻读)。

其实对于幻读, MySQL 的 InnoDB 引擎默认的 RR 级别已经通过 MVCC 自动帮我们解决了, 所以该级别下, 你也模拟不出幻读的场景; 退回到 RC 隔离级别的话, 你又容易把幻读和不可重复读搞混淆, 所以这可能就是比较头痛的点吧!

理论上 RR 级别是无法解决幻读的问题, 但是由于 InnoDB 引擎的 RR 级别还使用了 MVCC, 所以也就避免了幻读的出现!

幻读的延伸

MVCC 虽然解决了幻读问题, 但严格来说只是解决了部分幻读问题, 接下来进行演示:

1. 打开客户端 1 查看隔离级别及初始数据

mysql  SELECT @@SESSION.tx_isolation;
+------------------------+| @@SESSION.tx_isolation |+------------------------+| REPEATABLE-READ |+------------------------+1 row in set (0.00 sec)
 
mysql  select * from test_transaction;
+----+-----------+-----+--------+--------------------+| id | user_name | age | gender | desctiption |+----+-----------+-----+--------+--------------------+| 1 |  金刚狼  | 127 | 1 |  我有一双铁爪  || 2 |  钢铁侠  | 120 | 1 |  我有一身铁甲  || 3 |  绿巨人  | 0 | 2 |  我有一身肉  |+----+-----------+-----+--------+--------------------+3 rows in set (0.00 sec) 
mysql

2. 打开客户端 2 查看隔离级别及初始数据

mysql  SELECT @@SESSION.tx_isolation;
+------------------------+| @@SESSION.tx_isolation |+------------------------+| REPEATABLE-READ |+------------------------+1 row in set (0.00 sec)
 
mysql  select * from test_transaction;
+----+-----------+-----+--------+--------------------+| id | user_name | age | gender | desctiption |+----+-----------+-----+--------+--------------------+| 1 |  金刚狼  | 127 | 1 |  我有一双铁爪  || 2 |  钢铁侠  | 120 | 1 |  我有一身铁甲  || 3 |  绿巨人  | 0 | 2 |  我有一身肉  |+----+-----------+-----+--------+--------------------+3 rows in set (0.00 sec) 
mysql

3. 在客户端 2 中开启事务, 然后查询数据

mysql  begin;
Query OK, 0 rows affected (0.00 sec)
mysql  select * from test_transaction;
+----+-----------+-----+--------+--------------------+| id | user_name | age | gender | desctiption |+----+-----------+-----+--------+--------------------+| 1 |  金刚狼  | 127 | 1 |  我有一双铁爪  || 2 |  钢铁侠  | 120 | 1 |  我有一身铁甲  || 3 |  绿巨人  | 0 | 2 |  我有一身肉  |+----+-----------+-----+--------+--------------------+3 rows in set (0.00 sec)
mysql

4. 在客户端 1 中插入一条 id 为 4 的新数据 (直接自动提交)

mysql  insert into test_transaction (`id`,`user_name`,`age`,`gender`,`desctiption`) values (4,  死侍 , 18, 0,  A bad boy 
Query OK, 1 row affected (0.00 sec)
mysql  select * from test_transaction;
+----+-----------+-----+--------+--------------------+| id | user_name | age | gender | desctiption |+----+-----------+-----+--------+--------------------+| 1 |  金刚狼  | 127 | 1 |  我有一双铁爪  || 2 |  钢铁侠  | 120 | 1 |  我有一身铁甲  || 3 |  绿巨人  | 0 | 2 |  我有一身肉  || 4 |  死侍  | 18 | 0 | A bad boy |+----+-----------+-----+--------+--------------------+4 rows in set (0.00 sec) 
mysql

5. 在客户端 2 事务中再次查询数据, 发现数据没有变化 (表示可以重复读, 并且克服了幻读)!! 但是在客户端 2 事务中插入一条 id 为 4 的新数据, 发现提示数据已经存在!

mysql  begin;
Query OK, 0 rows affected (0.00 sec) 
mysql  select * from test_transaction;
+----+-----------+-----+--------+--------------------+| id | user_name | age | gender | desctiption |+----+-----------+-----+--------+--------------------+| 1 |  金刚狼  | 127 | 1 |  我有一双铁爪  || 2 |  钢铁侠  | 120 | 1 |  我有一身铁甲  || 3 |  绿巨人  | 0 | 2 |  我有一身肉  |+----+-----------+-----+--------+--------------------+3 rows in set (0.00 sec)
mysql  select * from test_transaction;
+----+-----------+-----+--------+--------------------+| id | user_name | age | gender | desctiption |+----+-----------+-----+--------+--------------------+| 1 |  金刚狼  | 127 | 1 |  我有一双铁爪  || 2 |  钢铁侠  | 120 | 1 |  我有一身铁甲  || 3 |  绿巨人  | 0 | 2 |  我有一身肉  |+----+-----------+-----+--------+--------------------+3 rows in set (0.00 sec)
mysql  insert into test_transaction (`id`,`user_name`,`age`,`gender`,`desctiption`) values (4,  死侍 , 18, 0,  A bad boy 1062 - Duplicate entry  4  for key  PRIMARY mysql  
// 并且,  此时 `update/delete` 也是可以操作这条在事务中看不到的记录的!

到此,关于“MySQL 的不可重复读和幻读是什么意思”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-13发表,共计3795字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)