【发布时间】:2016-09-02 17:51:38
【问题描述】:
在 MySQL 中处理双花问题的推荐方法是什么?比如说,我有一个应用程序将 $x 从帐户 A 转移到 B,如下所示:
- 开始交易
- 确保帐户
A具有balance >= $x - 将
$x添加到B的余额中 - 从
A的余额中扣除$x - 提交(或在查询失败时回滚)
我正在考虑同时执行两个相同事务以将$x 从A 转移到B 的场景。只要A 的余额至少为$x,步骤#2 中的检查将通过每笔交易,因为两者都还没有更新余额。这将允许攻击者为 A 的全部余额发出两笔交易,并让它们都执行,从而使他能够花费账户余额的两倍。
推荐的解决方法是什么?将 MySQL 隔离级别设置为REPEATABLE_READ 是否足以防止这种情况发生?或者,我可以确保从 A 的余额中扣除的查询包含一个 WHERE balance > $x 子句,然后如果受影响的行数为零,则回滚事务。但是,理想情况下,我希望由 DBMS 层自行处理。
谢谢!
【问题讨论】:
-
查看链接问题中的所有答案。
-
先颠倒第 3 步和第 4 步。
标签: mysql transactions