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