【问题标题】:Locking a row in a MYSQL table during a transaction在事务期间锁定 MYSQL 表中的行
【发布时间】:2018-08-15 09:41:58
【问题描述】:

我有一批这样的查询:

START TRANSACTION
SELECT amount FROM piggybank WHERE id = 2
UPDATE piggybank SET amount = amount + 5 WHERE id = 1
COMMIT

我需要确保没有其他人可以读取或写入 ID 为 1 和 2 的行,直到事务结束。 (锁定整个表也可以) 问题是,当我阅读 MySQL 手册时,它说启动一个事务将清除在启动它之前所做的任何锁定,反过来,锁定将提交任何传出事务。

但我需要同时锁定行(或表)并使用事务。

【问题讨论】:

    标签: mysql locking innodb


    【解决方案1】:

    在事务中使用select ... for update 查询应该会为您提供所需的语义 - 其他更新将被锁定,而其他尝试获取相同锁定的会话将阻塞,直到您提交:

    START TRANSACTION
    SELECT * FROM piggybank WHERE id IN (1, 2) FOR UPDATE;
    SELECT amount FROM piggybank WHERE id = 2;
    UPDATE piggybank SET amount = amount + 5 WHERE id = 1;
    COMMIT
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 2011-05-12
      • 2016-03-22
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      相关资源
      最近更新 更多