获得徽章 0
JavaGaga的头像
Java后端研发工程师 @ 滴滴
JavaGaga的头像
Java后端研发工程师 @ 滴滴
Java进阶视频和算法视频,大厂面试资料和网约车项目讲解源码视频有人需要吗?
5
JavaGaga的头像
Java后端研发工程师 @ 滴滴
JavaGaga的头像
关注了
wolisi12
VIP.4 融会贯通
Java后端研发工程师 @ 滴滴
JavaGaga的头像
Java后端研发工程师 @ 滴滴
JavaGaga的头像
关注了
徳臥k
VIP.5 如鱼得水
Java后端研发工程师 @ 滴滴
JavaGaga的头像
Java后端研发工程师 @ 滴滴
JavaGaga的头像
Java后端研发工程师 @ 滴滴
JavaGaga的头像
关注了
恋猫de小郭
VIP.5 如鱼得水
Java后端研发工程师 @ 滴滴
黑马程序员怎么样
12
#新人报道# 大家觉得马士兵教育怎么样?
34
赞了这篇沸点
什么是幻读?

幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。

首先快照读是不存在幻读的,只有当前读(实时读)才存在幻读的问题。

幻读有什么问题?

select ...for update语句就是将相应的数据行锁住,但是如果存在幻读,就把for update的语义破坏了。

如何解决幻读?

产生幻读的原因是,行锁只能锁住行,但是新插入记录这个动作,要更新的是记录之间的“间隙”。因此,为了解决幻读问题,InnoDB只好引入新的锁,也就是间隙锁(Gap Lock)。间隙锁和行锁合称next-key lock,每个next-key lock是前开后闭区间。

总结

RR(可重复读)隔离级别下间隙锁才有效,RC(提交读)隔离级别下没有间隙锁;
RR隔离级别下为了解决“幻读”问题:“快照读”依靠MVCC控制,“当前读”通过间隙锁解决;
间隙锁和行锁合称next-key lock,每个next-key lock是前开后闭区间;
间隙锁的引入,可能会导致同样语句锁住更大的范围,影响并发度。
展开
评论
下一页
个人成就
文章被点赞 460
文章被阅读 31,357
掘力值 2,464
收藏集
0
关注标签
23
加入于