在MySQL/InnoDB中锁定一行总是锁定所有关联的索引记录



当锁定mysql/innodb中的一行时(无论是由于交易的隔离级别,还是明确地使用 SELECT * ... FOR UPDATE或````Share Mode)''):

此锁还适用于与该行关联的所有索引记录,还是仅将用于锁定语句本身访问锁的索引记录?

作为一个例子,假设存在带有xyz列的表,其中xy被索引。

语句SELECT * FROM Table WHERE x = foo(返回(x = foo, y = bar, z = c)的记录)是否还会使诸如SELECT * FROM Table WHERE y = bar之类的所有语句在锁上等待,或者仍然可以同时执行这些记录(假设他们不会尝试修改锁定行本身)?

更新:请注意,有关索引记录或GAP锁的问题是不是。这是关于通过扫描索引x读取锁定的具体情况,以及是否会通过y进行查询。

tl; dr:no.

当您使用mysql/innodb和 SELECT *... FOR UPDATE时,锁定的行是唯一的选择您选择的行。

在您的情况下 - 如果您有一个SELECT * FROM Table WHERE x = foo FOR UPDATE,则只锁定与WHERE x = foo匹配的行(如果您有其他一些y = bar AND x != foo的行,则这些行不会锁定。

相关内容

  • 没有找到相关文章

最新更新