2016-05-07 54 views
0

在MySQL中处理双重支出问题的推荐方式是什么?说,例如,我有转移$x从账号AB像这样的应用程序:MySQL Transactions&Double Spending

  1. 开始交易
  2. 确保占Abalance >= $x
  3. 添加$xB的平衡
  4. 扣除$xA的余额
  5. 提交(或回滚,如果查询失败)

我在考虑两个相同的事务同时执行以将$xA转换为B的情况。只要A的余额至少为$x,步骤#2中的支票将通过每笔交易,因为两者均未更新余额。这将允许攻击者发出两笔交易,整个金额为A,并且两笔交易均已执行,因此可以将帐户余额加倍。

建议如何解决这个问题?将MySQL隔离级别设置为REPEATABLE_READ是否足以防止这种情况发生?或者,我可以确保从A余额中扣除的查询包含WHERE balance > $x子句,如果影响零行,则回滚事务。但是,理想情况下,我希望通过DBMS层本身来处理这个问题。

谢谢!

+1

[mySQL Transactions vs Locking Tables]的可能重复(http://stackoverflow.com/questions/4226766/mysql-transactions-vs-locking-tables) –

+0

查看链接问题中的所有答案。 –

+0

从倒转第3步和第4步开始。 –

回答

0

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

,然后只更新余额与无余额-x在查询的WHERE子句这将阻止更新为小于零

总是试图拿钱出来的帐户的第一把在另一个之前的平衡帐户。它在逻辑上也更有意义,因为您需要在银行转账或购买东西之前从银行取钱。我不知道你为什么以相反的顺序现在。