MySQL Transactions&双倍花费

时间:2016-05-07 19:48:37

标签: mysql transactions

在MySQL中处理双重支出问题的推荐方法是什么?比方说,我有一个应用程序将$x从帐户A转移到B,如下所示:

  1. 开始交易
  2. 确保帐户A具有balance >= $x
  3. $x添加到B余额
  4. $x余额中扣除A
  5. 提交(或查询失败时回滚)
  6. 我正在考虑同时执行两个相同的交易以将$xA转移到B的情况。只要A的余额至少为$x,步骤#2中的检查就会通过每笔交易,因为两者都尚未更新余额。这将允许攻击者为整个A余额发出两笔交易并让它们都被执行,从而使他能够将帐户余额翻倍。

    推荐的解决方法是什么?将MySQL隔离级别设置为REPEATABLE_READ是否足以防止这种情况发生?或者,我可以确保从A的余额中扣除的查询包含WHERE balance > $x子句,然后在受到影响的行数为零时回滚事务。但是,理想情况下,我希望由DBMS层本身处理。

    谢谢!

1 个答案:

答案 0 :(得分:0)

也许你可以创建一个触发器,当余额为<更新时为0。

然后只更新余额以在查询中平衡-x而没有where子句,这会阻止余额更新为小于零

在放入另一个帐户之前,总是先尝试从帐户中取款。它在逻辑上更有意义,因为你需要在转移或购买东西之前从银行取钱。我现在不知道你为什么要以相反的顺序拥有它。