更新数据或者 for update 都是先读后写的,而这个读,只能读当前的值,称
为“当前读(current read)
CREATE TABLE `t` (
`id` int(11) NOT NULL,
`c` int(11) DEFAULT NULL,
`d` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `c` (`c`)
) ENGINE=InnoDB;
insert into t values(0,0,0),(5,5,5),
(10,10,10),(15,15,15),(20,20,20),(25,25,25);

1. 在可重复读隔离级别下,普通的查询是快照读,是不会看到别的事务插入的数据的。因此,
幻读在“当前读”下才会出现。
2. 上面 session B 的修改结果,被 session A 之后的 select 语句用“当前读”看到,不能称
为幻读。幻读仅专指“新插入的行”。
幻读会导致的问题:
1、语义上,把所有的行都锁上,但是还是可以新插入数据
2、数据的一致性,幻读会破坏数据和日志在逻辑上的一致性,即binlog的顺序被破坏,导致主从同步或者复制库的时候,出现数据的不一致。
解决的幻读的方法:
加入间隙锁,间隙锁是在可重复读隔离级别下才会生效的 ,但是加入间隙锁会导致锁的粒度变大,影响到并发度。