【问题标题】:MySQL - record locks on query with multiple conditionsMySQL - 在具有多个条件的查询上记录锁定
【发布时间】:2018-01-08 03:08:16
【问题描述】:

引擎:InnoDB company_id 在这种情况下是主键。 当我运行以下 sql 时,它只锁定被选中的行:

select * from company where company_id = 1 for update

=> 1 行锁定

select * from company where company_id in (1, 2) for update

=> 2 行锁定

但是当条件数增长到五个时,sqls长这样,会锁住整个表:

SELECT
    * 
FROM
    company 
WHERE
    company_id = 1 
    OR company_id = 2 
    OR company_id = 3 
    OR company_id = 4 
    OR company_id = 5
FOR UPDATE

=> 表被锁定

SELECT
    * 
FROM
    company 
WHERE
    company_id IN (1, 2, 3, 4, 5)
FOR UPDATE

=> 表被锁定

有没有什么办法可以只用一个查询(有多个条件)锁定多条记录?

====================问题已解决=========================== ====

很抱歉,我在第一次编辑问题时错过了“更新”。

【问题讨论】:

标签: mysql sql


【解决方案1】:

我认为 select 命令不会锁定您选择的行。根据文档https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html,您应该使用 SELECT ... FOR UPDATE 来锁定行。

【讨论】:

  • 根据我的实验结果。如果您 SELECT ... FOR UPDATE 超过 1 行,MYSQL 将锁定该表。但是,如果您每次都 SELECT ... FOR UPDATE 1 行,那么 MYSQL 会按照我们的想法工作。因此,请为一个 sql 命令锁定 1 行。如果你想锁定 3 行,SELECT ... FOR UPDATE 3 次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 2016-02-08
  • 2018-08-03
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多