SELECT ... LOCK IN SHARE MODE在读取的所有行上设置共享模式锁。其他会话可以读取行,但在事务提交之前无法修改它们。如果这些行中的任何行已被另一个尚未提交的事务更改,则查询将等待该事务结束,然后使用最新值。
然而,一些实验表明它锁定的次数多于读取的行数。
CREATE TABLE example (a int);
START TRANSACTION;
SELECT a FROM example WHERE a = 0 LOCK IN SHARE MODE;
然后是另一个连接
INSERT INTO example VALUES (1);
锁上的后续连接阻止。
LOCK IN SHARE MODE
似乎锁定了超过"任何读取的行"。
确实LOCK IN SHARE MODE
锁定了什么?
答案 0 :(得分:2)
确保WHERE a = 0
列上有索引。否则,为了评估ALTER TABLE example ADD INDEX (a);
,它必须读取表中的每一行,然后在读取每行时设置一个锁。
A