Mysql 为什么平等条款中需要间隙锁

Mysql 为什么平等条款中需要间隙锁,mysql,locking,innodb,Mysql,Locking,Innodb,如果id没有索引或索引不唯一,则语句会锁定前面的间隙。根据mysql文档。 为什么这里需要间隙锁。id=100的索引上的记录锁定将锁定id=100的表的所有插入、更新和删除 因此,即使有多个id为100的行,也不会有幻影读取。为什么在这种情况下使用间隙锁?id=100的行上的(行)锁将阻止插入id=100的另一行,如果且仅当该行是唯一索引时(因为该行已经存在并且无论如何都无法再次插入)。行锁是一个记录锁,实际上是一个索引记录锁,因此,值为100的索引将被锁定。无法为索引=100插入更多行。如果

如果id没有索引或索引不唯一,则语句会锁定前面的间隙。根据mysql文档。

为什么这里需要间隙锁。id=100的索引上的记录锁定将锁定id=100的表的所有插入、更新和删除


因此,即使有多个id为100的行,也不会有幻影读取。为什么在这种情况下使用间隙锁?

id=100的行上的(行)锁将阻止插入id=100的另一行,如果且仅当该行是唯一索引时(因为该行已经存在并且无论如何都无法再次插入)。行锁是一个记录锁,实际上是一个索引记录锁,因此,值为100的索引将被锁定。无法为索引=100插入更多行。如果您在非唯一的
id
-索引中的第10行上持有锁,为什么它会阻止我将主键第8行更新为
id=100
,并将其作为第9行添加到
id
-索引中?如果它是一个唯一的索引,这是不允许的(这就是为什么没有gaplock)。当然,您可以先检查索引行10是否被锁定,以及它是否与新行9具有相同的id。但是,其他人可能会问:为什么我们不使用gaplock?在你问:是的,还有其他交易系统。但是MySQL是这样做的。@Solarflare但是这样,MySQL不需要锁定整个表以防止任何记录被更新为id=100吗?为什么只锁定“前面的差距”?@Nowhy如果您试图更新id,MySQL需要将其插入到“id=100”的索引中。所以首先检查:我想更新的行上有锁吗?不。那么:我想要这一排的地方有锁吗?Yes->Lock Handling(行)锁定id=100的行将阻止插入id=100的另一行,当且仅当该行是唯一索引时(因为此时该行已存在且无论如何无法再次插入)。行锁定是一个记录锁定,实际上是一个索引记录锁定,因此值为100的索引将被锁定。无法为索引=100插入更多行。如果您在非唯一的
id
-索引中的第10行上持有锁,为什么它会阻止我将主键第8行更新为
id=100
,并将其作为第9行添加到
id
-索引中?如果它是一个唯一的索引,这是不允许的(这就是为什么没有gaplock)。当然,您可以先检查索引行10是否被锁定,以及它是否与新行9具有相同的id。但是,其他人可能会问:为什么我们不使用gaplock?在你问:是的,还有其他交易系统。但是MySQL是这样做的。@Solarflare但是这样,MySQL不需要锁定整个表以防止任何记录被更新为id=100吗?为什么只锁定“前面的差距”?@Nowhy如果您试图更新id,MySQL需要将其插入到“id=100”的索引中。所以首先检查:我想更新的行上有锁吗?不。那么:我想要这一排的地方有锁吗?是->锁处理
SELECT * FROM child WHERE id = 100;