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
Open

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

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

Comments

@git-zjx
Copy link
Owner

@git-zjx git-zjx 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
@git-zjx git-zjx self-assigned this Apr 1, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
MySQL
MySQL实战45讲
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
1 participant