innodb 存储引擎。select * from test_table where id = 3 for update; 其中 id 为唯一索引,且不存在 id = 3 这一行, 此时为何要使用间隙锁呢?

2020-03-05 21:48:58 +08:00
 jdz
4072 次点击
所在节点    MySQL
25 条回复
BBCCBB
2020-03-06 14:36:21 +08:00
@jdz 因为他要锁索引, 而 id=3 的索引目前不存在, 不能直接锁 id=3 的索引, 所以他就锁区间来解决 这个问题...
Aresxue
2020-03-07 14:26:17 +08:00
间隙锁是为防止幻读,因为 id=3 不存在所以要锁定区间,如果存在就是行锁了
jsdi
2022-03-13 15:07:54 +08:00
我的理解是因为这是当前读,当前读不仅要对当前记录加行锁,还要对邻近记录加间隙锁防止幻读

当前读:读取最新版本数据,除了 for update ,还有 insert 、update 、delete 都是当前读
cocong
2022-03-24 17:50:42 +08:00
因为锁是加在索引上的,但是 id=3 这条记录不存在,当然也就不存在这个索引了,那你说怎么加?只能让未来可能插入索引的那个位置 的那个间隙的两边的索引来帮忙了。这样其它事务想新增 id=3 的记录时,就得先问问旁边那两位索引兄弟:“朋友,这里没人坐吧?”,答:“有人做了”。这不,就添加不了了。
cocong
2022-03-24 17:52:53 +08:00
前面的问法不合适,感觉这么问更准确些:“朋友,我能过来挤一挤吗?”,答:“不好意思,我俩被锁住了!”

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/650223

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX