纸上得来终觉浅,实践一下便知道。
先上实验数据
create table `student_name`(
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(20) not null ,
`score` int not null,
PRIMARY KEY (`id`),
KEY `idx_c` (`score`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
insert into `student_name` values(1, '小林', 60), (2, '小明', 70), (3, '小红', 80), (4, '小蓝', 80);
RR级别下,先测试一下当前读。
session1:
session2中插入一条
commit之后
session1 先修改该条数据,然后再读一次,就出现了幻读的现象。
顺带验证了下 锁 看到update语句执行了18.96秒 是因为 忘记在session2当中commit了 id = 5的那条数据还有session2的行锁,因此session1一直阻塞到session2commit了
疑惑点:这种情况是由于快照读之后,执行了一次当前读(也就是那条update 语句),然后再次快照读。导致了脏读,那么究竟算不算是幻读呢?希望得到指点。
至于select for update采用的是当前读,使用的是间隙锁,是可以避免幻读的,下次补充下实验。