在MySQL中处理双重支出问题的推荐方法是什么?比方说,我有一个应用程序将$x
从帐户A
转移到B
,如下所示:
A
具有balance >= $x
$x
添加到B
余额$x
余额中扣除A
我正在考虑同时执行两个相同的交易以将$x
从A
转移到B
的情况。只要A
的余额至少为$x
,步骤#2中的检查就会通过每笔交易,因为两者都尚未更新余额。这将允许攻击者为整个A
余额发出两笔交易并让它们都被执行,从而使他能够将帐户余额翻倍。
推荐的解决方法是什么?将MySQL隔离级别设置为REPEATABLE_READ
是否足以防止这种情况发生?或者,我可以确保从A的余额中扣除的查询包含WHERE balance > $x
子句,然后在受到影响的行数为零时回滚事务。但是,理想情况下,我希望由DBMS层本身处理。
谢谢!
答案 0 :(得分:0)
也许你可以创建一个触发器,当余额为<更新时为0。
然后只更新余额以在查询中平衡-x而没有where子句,这会阻止余额更新为小于零
在放入另一个帐户之前,总是先尝试从帐户中取款。它在逻辑上更有意义,因为你需要在转移或购买东西之前从银行取钱。我现在不知道你为什么要以相反的顺序拥有它。