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

网友投稿 474 2023-11-22

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

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

幻读

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

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

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

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

其实对于幻读, 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.00sec)   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.00sec)   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.00sec) 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.00sec) mysql>

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

mysql> insert into test_transaction (`id`,`user_name`,`age`,`gender`,`desctiption`) values (4死侍180A bad boy); Query OK, 1 row affected (0.00sec) 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.00sec)  mysql>

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

mysql> begin; Query OK, 0 rows affected (0.00sec)  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.00sec) 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.00sec) mysql> insert into test_transaction (`id`,`user_name`,`age`,`gender`,`desctiption`) values (4,死侍180A bad boy);1062 - Duplicate entry 4 for key PRIMARYmysql>  //并且, 此时`update/delete`也是可以操作这条在事务中看不到的记录的!

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:数据库的乐观锁如何实现
下一篇:如何优化sql中order By语句
相关文章

 发表评论

暂时没有评论,来抢沙发吧~