在事务期间锁定MYSQL表中的行

时间:2018-03-07 10:16:19

标签: mysql innodb

我有一批像这样的查询:

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

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

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

1 个答案:

答案 0 :(得分:0)

在事务中使用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