【问题标题】:LOCK IN SHARE MODE locks entire tableLOCK IN SHARE MODE 锁定整个表
【发布时间】:2016-05-27 22:37:47
【问题描述】:

Documentation:

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 锁定了什么究竟

【问题讨论】:

    标签: mysql concurrency locking row innodb


    【解决方案1】:

    确保您在 a 列上有索引。否则,为了评估WHERE a = 0,它必须读取表中的每一行,然后在读取时对每一行设置一个锁。

    ALTER TABLE example ADD INDEX (a);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      • 2019-02-10
      • 2023-03-17
      相关资源
      最近更新 更多