文档:
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
究竟锁定了什么?
确保a
列上有索引。否则,为了评估WHERE a = 0
,它必须读取表中的每一行,然后在读取时对每一行设置一个锁。
ALTER TABLE example ADD INDEX (a);