MySql 将值从一行安全转移到另一行

标签 mysql sql transactions innodb

我在表中有一列名为余额。 这些值代表真钱。我需要将一定数量的数据从一行安全地转移到另一行。

因此从第 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/

相关文章:

sql - 检查一个值是否存在然后在 Sql 中更新或插入的最有效方法是什么

java - Spring Maven、MySQL、Hibernate、GlassFish : javax. persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey

php - MySQL 查询非常慢

java - 多个应用程序之间共享事务

sql - 为什么 SQL 数据库在命令日志上使用预写日志?

mysql - 比较 MySQL 中两个查询的性能

sql - 如何计算这些列中有多少列在 SQL 中具有值?

php - 如何使用 SUM 并返回所有行,即使没有什么可以求和?

mysql - MySQL 数据库事务是否会破坏使用 RefreshDatabase 或 DatabaseTransactions 的 Laravel PHPUnit 测试?

mysql - 将一个 SQL 查询的结果添加到另一个查询