MySQL的RR隔离级和间隙锁

本文详细解析了InnoDB数据库中幻读现象及其产生的原因,深入探讨了间隙锁(Gap Lock)的作用机制,以及如何通过Next-Key Locks解决幻读问题,保障事务的隔离性和一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

select * from t where d=5 for update;使用的是当前读;当前读的规则就是能够读到所有已经提交的记录的最新值;

幻读 仅仅指新插入的行;

如何解决幻读

    产生幻读的原因是,行锁只能锁住已经存在的行,但是对于向行之间insert数据行这个动作,要更新的是记录之间的间隙。为解决这个问题,InnoDB引入了 gap lock。间隙锁就是锁住两个值之间的间隙。上述插入6条记录机会形成7个间隙。

    当有间隙锁的时候,select * from t for update;不仅给数据库上的6条记录加行锁,同时加7个间隙锁。这样可以确保没有数据可以插入。

    行锁分为读锁和写锁,其中写锁是互斥的;间隙锁只和向间隙中插入数据有冲突,多个会话之间的间隙锁是不冲突的。

    间隙锁和行锁合称为next-key lock,每个next-key lock都是前开后闭的区间。也就是说select * from t for update;会形成7个next-key lock,分别是:(-∞,0]、(0,5]、(5,10]、(10,15]、(15,20]、(20, 25]、(25, +supremum]。

间隙锁可能会带来死锁的问题

https://static001.geekbang.org/resource/image/df/be/df37bf0bb9f85ea59f0540e24eb6bcbe.png

间隙锁的引入可能会影响并发访问。

对于select * from t where id=9,这样一个不存在行,锁住的区间是(5,10);

对于select * from t where id=5,这样存在的行锁住的是(0,5]这样的区间,其实也就是一个行锁加一个间隙锁,就构成了一把net-key lock;

间隙锁只有在RR隔离级下才可以生效,在RC隔离级下无法生效的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请叫我曾阿牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值