在MYSQL表中的事务过程中锁定一行

5

我有一批像这样的查询:

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

我需要确保在事务结束前,没有其他人能够读写ID为1和2的行(锁定整个表也可以)。问题是,当我阅读MySQL手册时,它说开始一个事务会清除在此之前所有的锁,并且锁定会提交任何正在进行的事务。

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

1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接