LOCK IN SHARE MODE锁定整个表



文档:

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);

最新更新