结论
在快照读的情况下,InnoDB通过mvcc机制解决了幻读问题;
当前读的情况下,InnoDB是无法通过mvcc解决幻读的现象,因为它每次读取的都是最新的数据。
演示
环境(很重要)
MySQL版本:8.0.28、可重复读事务隔离级别、InnoDB存储引擎
确保当前事务为手动提交
数据准备
drop table if exists test;
create table test(
id int(11),
name varchar(20),
class_id int(11)
) engine innodb default charset = utf8;
insert into test values(1, 'henry1', 1);
insert into test values(2, 'henry2', 1);
事务操作
第一步:事务一执行select查询语句,事务未提交,结果入下图所示:
第二步:事务二新插入一条数据,并提交事务
第三步:事务一再次以相同条件查询,可以看到数据未变化,此时满足可重复读
第四步:事务一执行update更新语句
第五步:事务一再次以相同条件查询,可以看到数据发生变化,出现幻读现象
总结
MySQL 可重复读隔离级别并没有彻底解决幻读,只是很大程度上避免了幻读现象的发生。