我在表中有一列名为余额。 这些值代表真钱。我需要将一定数量的数据从一行安全地转移到另一行。
因此从第 1 行减去该值并添加到第 2 行。如果第 1 行余额低于该值,则整个转移操作应该失败并且两行 ramin 都保持不变。
因为我使用的是 innodb,所以我能够使用事务来包装选择和更新 但是如果有一个有效的原子操作来防止在出现故障时长时间回滚的锁定,那就太好了。
是否有更新这两行的有效方法?
最佳答案
您需要做的是像这样的一系列操作。
START TRANSACTION;
SELECT (the row you're going to decrement) FOR UPDATE;
SELECT (the row you're going to increment) FOR UPDATE;
Your updates, whatever they are.
COMMIT;
使用 InnoDB 或 Aria存储引擎,这将做你需要的。这是一个解释:http://dev.mysql.com/doc/refman/5.5/en/innodb-locking-reads.html
无论您首先SELECT ... FOR UPDATE
减少行还是增加行都没有关系,只要您总是选择它们以相同的顺序。否则你的philosophers will get hungry .
关于MySql 将值从一行安全转移到另一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12397053/