在事务期间锁定 MYSQL table 中的一行

Locking a row in a MYSQL table during a transaction

我有一批这样的查询:

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

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

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

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