MVCC在RC隔离级别下可以解决脏读现象
MVCC在RR隔离级别下解决了不可重复读

幻读:在InnoDB的可重复度隔离级别下,使用当前读,一个事务前后两次查询同一个范围,后一次查询会看到期间新插入的行;

  • 幻读的影响:会导致一个事务中先产生的锁,无法锁住后加入的行,会产生数据一致性问题;
  • 产生幻读的原因:行锁只能锁住一行,不能避免新插入的记录;
  • 解决幻读:在两行记录之间加上间隙锁,阻止新纪录的插入,与间隙锁产生冲突的只有“往这个间隙插入记录”这个操作;
  • 同时添加间隙锁与行锁称为Next-key lock,注意间隙锁只有在InnoDB的可重复度隔离级别下生效;
  • MVCC只实现读取已提交和可重复读,InnoDB在可重复度的隔离级别下,使用MVCC+Next-key lock解决幻读;

MVCC在select下是不会出现幻读的:因为是快照读

mysql默认下的select是快照读:
快照读是解决了幻读的:
SELECT
InnoDB会根据以下两个条件检查每行记录:

InnoDB只查询版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于事务的系统版本号),这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的);
行的删除版本要么未定义,要么大于当前事务版本号。这可以确保事务读取到的行,在事务之前未被删除。
只有符合上述两个条件的记录,才能返回作为查询结果。

在当前读下会产生幻读的现象

当前读
对于会对数据修改的操作(update、insert、delete)都是采用当前读的模式。在执行这几个操作时会读取最新的版本号记录,写操作后把版本号改为了当前事务的版本号,所以即使是别的事务提交的数据也可以查询到。假设要update一条记录,但是在另一个事务中已经delete掉这条数据并且commit了,如果update就会产生冲突,所以在update的时候需要知道最新的数据。也正是因为这样所以才导致幻读。

在快照读情况下,MySQL通过mvcc来避免幻读。
在当前读情况下,MySQL通过next-key来避免幻读

https://blog.csdn.net/qq_24760259/article/details/106981701?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.nonecase