美文网首页
对于幻读的理解

对于幻读的理解

作者: 倚仗听江 | 来源:发表于2020-12-28 13:53 被阅读0次

定义:事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B新插入的数据称为幻读。(读到了其他事务新插入的数据)
创建表和数据(Mysql 隔离级别为 可重复读)

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` bigint(10) NOT NULL,
  `username` varchar(50) DEFAULT NULL,
  `age` int(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'zhuangsan', '17');
INSERT INTO `user` VALUES ('2', 'lisi', '18');
INSERT INTO `user` VALUES ('3', 'wangwu', '18');

进行以下的操作:
A事务

BEGIN
-- T1时刻A事务查询所有年龄为18的用户
SELECT * FROM `user` where age = 18

-- T3时刻A事务查询所有年龄为18的用户
SELECT * FROM `user` where age = 18

-- T4时刻更新所有年龄为18的用户
UPDATE `user` SET username = 'ss' WHERE age = 18

-- T5时刻A事务查询所有年龄为18的用户
SELECT * FROM `user` where age = 18

B事务

-- T2时刻,B事务插入一条数据
INSERT INTO `user` VALUES (4,'sherlock',18)

在T1~T3时刻,可重复读隔离级别下貌似没有幻读问题,但实则不然。在T4时刻的影响条数是3条,T5时刻查出来的数据也是三条,产生了幻读的问题。

那么在可重复读级别下,能否解决幻读的问题呢?
答案是可以的。可重复读隔离级别下,一个事务中只使用当前读,或者只使用快照读都能避免幻读。
在快照读读情况下,Mysql通过MVCC来避免幻读。
在当前读读情况下,Mysql通过next-key来避免幻读。

什么是快照读和当前读

  1. 快照读:简单的select操作,属于快照读,不加锁。
  • select * from table where ?;
  1. 当前读:特殊的读操作,插入/更新/删除操作,属于当前读,需要加锁。
  • select * from table where ? lock in share mode;
  • select * from table where ? for update;
  • insert into table values (…);
  • update table set ? where ?;
  • delete from table where ?;

相关文章

  • 对于幻读的理解

    定义:事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时...

  • spring事务传播机制

    理解spring事务,就要理解数据库ACID的Isolation,隔离性。 脏读、不可重复读、幻读 这几种场景都是...

  • mySQL--深入理解事务隔离级别

    深入理解数据库事务隔离 脏读、幻读、不可重复读实战演练 一、事务的基本要...

  • 正确理解MYSQL的幻读

    一、定义1、幻读MYSQL官方叫法是Phantom Rows,意为鬼影行或者幻影行,请看官方定义:The so-c...

  • 脏读 不可重复读 幻读

    什么是事务 在了解脏读 不可重复读 幻读之前,有必要先理解事务(transaction)的定义及其目的。 定义 数...

  • MySQL - 幻读 、间隙锁

    select for update 加写锁。事物提交才释放 什么是幻读? 产生幻读的场景: 幻读指的是一个事务在前...

  • 理解事务的隔离特性

    理解事务的隔离特性 脏读、不可重复读、幻读 脏读:读到别的事务还未提交的修改 不可重复读:读到别的事务已提交的修改...

  • 系统原理-MVCC

    在SQL标准中,RR是无法避免幻读问题的,但是InnoDB实现的RR避免了幻读问题。RR解决脏读、不可重复读、幻读...

  • 数据库的隔离等级总结(重点区分sql标准中的不可重复读和幻读)

    《高性能mysql》这本书中,在解释sql标准的隔离等级的时候,有一些含混,造成理解不清。主要的原因在于理解,幻读...

  • 隔离级别:正确理解幻读

    在网络上看了几篇关于幻读的文章,总有些不对劲的地方,要么是解释过于官方看不懂,要么压根儿就是错的,于是我找到了著名...

网友评论

      本文标题:对于幻读的理解

      本文链接:https://www.haomeiwen.com/subject/liurnktx.html