2016-11-29 64 views
0

当在MySQL/InnoDB的行锁定(是否隐含由于事务的隔离级别,或明确使用SELECT * ... FOR UPDATE或``... LOCK IN SHARE MODE`):在MySQL/InnoDB中锁定行是否总是锁定所有关联的索引记录?

这是否锁也适用于与该行关联的所有索引记录,还是只锁定用于通过锁定语句本身访问锁的索引记录?

作为一个例子,假设存在一个yx,表,和z,其中xy进行索引。

将把该语句SELECT * FROM Table WHERE x = foo,它返回一个纪录(x = foo, y = bar, z = c)也会让所有的语句像SELECT * FROM Table WHERE y = bar等待上了锁,或可这些仍然可以并发执行(假设他们不会试图当然修改锁定行本身) ?

更新:请注意,问题是而不是关于索引记录或间隙锁的一般。这是关于通过扫描索引x锁定读取的具体情况,以及是否会使查询扫描超过y等待。

+0

此外,HTTPS:/ /www.percona.com/blog/2012/03/27/innodbs-gap-locks/ – Drew

+0

@Drew我知道索引记录和间隙锁定是如何工作的,这个问题具体是关于锁定查询未被扫描的索引。 – lxgr

+0

如在另一个数据库中? – Drew

回答

0

TL;博士:第

当你使用MySQL/InnoDB和你SELECT *... FOR UPDATE,被锁定的行是only the rows you selected

在你的情况 - 如果你有一个SELECT * FROM Table WHERE x = foo FOR UPDATE,只有那WHERE x = foo相匹配的行会被锁定(如果你是y = bar AND x != foo这些行不会锁定一些其他行

+0

In我的观察,甚至跳过的行都锁定在InnoDB中,这也与文档一致:http://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.html – lxgr

+0

查看“gap锁定”。 –