幻读问题
2 分钟阅读
•
271 字
+
152 词
在可重复读隔离级别上,为了
解决幻读
问题,InnoDB 只好引入新的锁,也就是
间隙锁 (Gap Lock)。
间隙锁和行锁
合称 next-key lock,每个
next-key lock(临键锁)
是
前开后闭
区间。也就是说,我们的表 t 初始化以后,如果用 select * from t for update 要把整个表所有记录锁起来,就形成了 7 个 next-key lock,分别是 (-∞,0]、(0,5]、(5,10]、(10,15]、(15,20]、(20, 25]、(25, +supremum]。
间隙锁和 next-key lock 的引入
,帮我们解决了幻读的问题,但同时也带来了一些“困扰”。
两个session分别存在间隙锁,然后分别往间隙锁里插入数据
间隙锁是在可重复读隔离级别下才会生效的。
所以,你
如果把隔离级别设置为读提交的话,就没有间隙锁了。
但同时,你要解决可能出现的数据和日志不一致问题,需要把 binlog 格式设置为 row。
如果读提交隔离级别够用,也就是说,业务不需要可重复读的保证,这样考虑到读提交下操作数据的锁范围更小(没有间隙锁),这个选择是合理的。