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

Ask*_*man 5 mysql innodb locking

我有一批这样的查询:

START TRANSACTION
SELECT amount FROM piggybank WHERE id = 2
UPDATE piggybank SET amount = amount + 5 WHERE id = 1
COMMIT
Run Code Online (Sandbox Code Playgroud)

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

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

Mur*_*nik 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
Run Code Online (Sandbox Code Playgroud)