广告
返回顶部
首页 > 资讯 > 数据库 >MySQL的不可重复读和幻读是什么意思
  • 558
分享到

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

2024-04-02 19:04:59 558人浏览 安东尼
摘要

这篇文章主要介绍“Mysql的不可重复读和幻读是什么意思”,在日常操作中,相信很多人在mysql的不可重复读和幻读是什么意思问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”My

这篇文章主要介绍“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.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的不可重复读和幻读是什么意思”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL的不可重复读和幻读是什么意思

本文链接: https://www.lsjlt.com/news/74242.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL的不可重复读和幻读是什么意思
    这篇文章主要介绍“MySQL的不可重复读和幻读是什么意思”,在日常操作中,相信很多人在MySQL的不可重复读和幻读是什么意思问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”My...
    99+
    2022-10-19
  • 不可重复读和幻读的区别是什么
    本篇文章和大家了解一下不可重复读和幻读的区别是什么。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。不可重复读和幻读区别:不可重复读的重点是修改;同样的条件,第1次和第2次读取的值不一样。幻...
    99+
    2022-10-18
  • 详解MySQL的脏读、幻读和不可重复读
    MySQL的脏读、幻读和不可重复读是数据库事务处理中的三种常见问题,它们都涉及到数据的一致性和并发性。本文将详细介绍这三种问题,并给出相应的解决方案和示例代码。 一、脏读(Dirty Read) 脏读是指一个事务读取了另一个事务未提交...
    99+
    2023-09-29
    mysql 数据库
  • Mysql中的幻读和不可重复读的区别
    Mysql中的幻读和不可重复读的区别是什么?这个问题可能是我们日常学习或工作经常见到的。通过这个问题,希望你能了解幻读和不可重复读的区别。不可重复读:同样的条件下,读取过的数据,当我们再次读取时值发生了变化...
    99+
    2022-10-18
  • 一文搞懂MySQL脏读,幻读和不可重复读
    目录MySQL 中事务的隔离1.READ UNCOMMITTED2.READ COMMITTED3.REPEATABLE READ4.SERIALIZABLE前置知识1.事务相关的常...
    99+
    2022-11-13
  • mysql数据库事务隔离级别及脏读、不可重复读、幻读是什么
    mysql数据库事务隔离级别及脏读、不可重复读、幻读是什么?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!一、数据库事务正确...
    99+
    2022-10-18
  • Mysql数据库事务的脏读幻读及不可重复读详解
    目录一、什么是数据库事务二、事务的ACID原则1. 原子性(Atomicity)2. 一致性(Consistency)3. 持久性(Durability)4. 隔离性(Isolati...
    99+
    2022-11-13
  • MySQL脏读幻读不可重复读及事务的隔离级别和MVCC、LBCC实现
    目录前言事务因并发出现的问题有哪些 脏读不可重复读幻读不可重复读与幻读的区别事务的四个隔离级别InnoDB默认的隔离级别是RRRead UnCommited 读未提交 RURead Commited 读已提交 RCRep...
    99+
    2022-07-11
    MySQL脏读幻读不可重复读 MySQL脏读幻读事务的隔离   MySQL MVCC MySQL LBCC
  • MySQL事务隔离级别以及脏读、幻读、不可重复读的示例
    小编给大家分享一下MySQL事务隔离级别以及脏读、幻读、不可重复读的示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!推荐(免费...
    99+
    2022-10-18
  • mysql脏读和幻读的区别是什么
    MySQL中的脏读(Dirty Read)是指一个事务在未提交前读取了另一个事务尚未提交的数据。而幻读(Phantom Read)则...
    99+
    2023-08-19
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作