当MySQL / InnoDB中的一行被锁定时(无论是隐式地由于事务的隔离级别,还是显式使用SELECT * ... FOR UPDATE
或``... LOCK IN SHARE MODE`):
此锁是否也适用于与该行关联的所有索引记录,或者只锁定用于通过锁定语句本身访问锁的索引记录?
例如,假设存在一个包含x
,y
和z
列的表,其中x
和y
已编入索引。< / p>
返回带有SELECT * FROM Table WHERE x = foo
的一条记录的语句(x = foo, y = bar, z = c)
是否会使所有语句如SELECT * FROM Table WHERE y = bar
等待锁定,或者这些语句是否仍然可以同时执行(假设它们不会当然,尝试修改锁定的行本身??
更新:请注意,一般来说,关于索引记录或缺口锁定的问题不。这是关于通过扫描索引x
进行锁定读取的具体情况,以及是否会使查询扫描y
等待。
答案 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
这些行被锁定。