幻读(phantom read)
- 前提条件:InnoDB引擎,可重复读隔离级别,使用当前读时。
- 表现:一个事务(同一个read view)在前后两次查询同一范围的时候,后一次查询看到了前一次查询没有看到的行。两点需要说明:
1、在可重复读隔离级别下,普通查询是快照读,是不会看到别的事务插入的数据的,幻读只在当前读下才会出现。
2、幻读专指新插入的行,读到原本存在行的更新结果不算。因为当前读的作用就是能读到所有已经提交记录的最新值。
幻读的影响
- 会造成一个事务中先产生的锁,无法锁住后加入的满足条件的行。
- 产生数据一致性问题,在一个事务中,先对符合条件的目标行做变更,而在事务提交前有新的符合目标条件的行加入。这样通过binlog恢复的数据是会将所有符合条件的目标行都进行变更的。
幻读产生的原因
- 行锁只能锁住行,即使把所有的行记录都上锁,也阻止不了新插入的记录。
如何解决幻读
- 将两行记录间的空隙加上锁,阻止新记录的插入;这个锁称为间隙锁。
- 间隙锁与间隙锁之间没有冲突关系。跟间隙锁存在冲突关系的,是往这个间隙中插入一个记录这个操作。
参考链接:
for update 排他锁 https://www.cnblogs.com/banma/p/11797560.html
lock in share mode 乐观锁 https://www.cnblogs.com/ylsx/p/13289711.html
phantom read 幻读 https://www.jianshu.com/p/c53c8ab650b5
在InnoDB引擎的可重复读隔离级别下,幻读问题会在当前读操作中出现,表现为事务在同一范围内前后两次查询结果不同,新增了原本不存在的行。幻读主要由新插入的行引起,而非已存在行的更新。它可能导致事务中的锁无法锁定新行,造成数据一致性问题。解决幻读的方法是使用间隙锁,阻止新记录的插入,确保事务内的数据稳定性。
1431

被折叠的 条评论
为什么被折叠?



