Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

20 | 幻读是什么,幻读有什么问题? #30

Open
git-zjx opened this issue Aug 6, 2019 · 0 comments

Comments

@git-zjx
Copy link
Owner

commented Aug 6, 2019

幻读是什么?

幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行
在可重复读隔离级别下,幻读在“当前读”下才会出现
幻读仅专指“新插入的行”

幻读有什么问题?

破坏语义
影响数据一致性,因为即使把所有的记录都加上锁,还是阻止不了新插入的记录

如何解决幻读?

为了解决幻读问题,InnoDB 只好引入新的锁,也就是间隙锁 (Gap Lock)。间隙锁,锁的就是两个值之间的空隙
在一行行扫描的过程中,不仅将给行加上了行锁,还给行两边的空隙,也加上了间隙锁
跟间隙锁存在冲突关系的,是“往这个间隙中插入一个记录”这个操作。间隙锁之间都不存在冲突关系。

间隙锁和行锁合称 next-key lock,我们把间隙锁记为开区间,把 next-key lock 记为前开后闭区间
InnoDB 给每个索引加了一个不存在的最大值 supremum,这样才符合我们前面说的“都是前开后闭区间”。

间隙锁和 next-key lock 的引入带来的问题

间隙锁的引入,可能会导致同样的语句锁住更大的范围,这其实是影响了并发度的
可以通过设置隔离级别为读提交+binlog=row避免,但要考虑实际的业务场景

@git-zjx git-zjx added this to MySQL实战45讲 in MySQL Aug 7, 2019

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
1 participant
You can’t perform that action at this time.