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

时间:2016-11-29 17:19:36

标签: mysql locking innodb

当MySQL / InnoDB中的一行被锁定时(无论是隐式地由于事务的隔离级别,还是显式使用SELECT * ... FOR UPDATE或``... LOCK IN SHARE MODE`):

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

例如,假设存在一个包含xyz列的表,其中xy已编入索引。< / p>

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

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

1 个答案:

答案 0 :(得分:0)

tl;博士:没有。

当您使用MySQL / InnoDB和Datastore datastore = DatastoreOptions.getDefaultInstance().getService(); 时,锁定的行为only the rows you selected

在您的情况下 - 如果您有SELECT *... FOR UPDATE,则仅锁定与SELECT * FROM Table WHERE x = foo FOR UPDATE匹配的行(如果您有其他行WHERE x = foo这些行被锁定。