首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么MySQL InnoDB也会获得Gap锁以进行更新/删除操作?

为什么MySQL InnoDB也会获得Gap锁以进行更新/删除操作?
EN

Stack Overflow用户
提问于 2020-03-26 08:55:27
回答 1查看 1.4K关注 0票数 2

据我所知,gap锁是用来防止幻影读取的,我发现gap锁是通过Google搜索在大多数文章中通过锁定读取来设置的。

gap锁是索引记录之间的间隙锁,或者是在第一个或最后一个索引记录之后的间隙锁。例如,从t选择c1,c1在10到20之间进行更新;阻止其他事务将值15插入列t.c1,无论列中是否已经存在此类值,因为范围中的所有现有值之间的差距被锁定。

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-gap-locks

我想这个(锁定读时设置间隙锁)就足够了。为什么更新删除也设置间隙锁。

更新..。在哪里..。在搜索遇到的每一条记录上为设置一个独占的下键锁。但是,对于使用唯一索引锁定行以搜索唯一行的语句,只需要索引记录锁。

https://dev.mysql.com/doc/refman/8.0/en/innodb-locks-set.html

另一个问题是,如果没有合适的索引可以连接间隙锁,那么会发生什么情况?会倒回去锁在整张桌子上吗?

在这里,我们假设使用默认事务隔离级别可重复读取。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-26 17:19:10

这取决于选择、更新或删除中的条件。它们设置间隙锁,以防止其他并发会话向集合中添加将由条件匹配的行。

在InnoDB中,锁定语句总是锁定最近提交的行版本。因此,它们并不真正遵守可重复读取快照。他们表现得更像读书。

因此,如果您执行这样的语句:

代码语言:javascript
复制
UPDATE FROM MyTable SET ... WHERE created_at > '2020-03-22';

它必须按照created_at的最高值锁定空白,这将阻止其他会话添加新行。

这是为了模拟可重复读取,以确保如果再次运行相同的更新,它将影响相同的行,并且不会意外地影响新的行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60863741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档