当锁定mysql/innodb中的一行时(无论是由于交易的隔离级别,还是明确地使用 SELECT * ... FOR UPDATE
或````Share Mode)''):
此锁还适用于与该行关联的所有索引记录,还是仅将用于锁定语句本身访问锁的索引记录?
作为一个例子,假设存在带有x
,y
和z
列的表,其中x
和y
被索引。
语句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
的行,则这些行不会锁定。