【问题标题】:MySQL Transactions & Double SpendingMySQL 交易和双花
【发布时间】:2016-09-02 17:51:38
【问题描述】:

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

  1. 开始交易
  2. 确保帐户A 具有balance >= $x
  3. $x 添加到B 的余额中
  4. A的余额中扣除$x
  5. 提交(或在查询失败时回滚)

我正在考虑同时执行两个相同事务以将$xA 转移到B 的场景。只要A 的余额至少为$x,步骤#2 中的检查将通过每笔交易,因为两者都还没有更新余额。这将允许攻击者为 A 的全部余额发出两笔交易,并让它们都执行,从而使他能够花费账户余额的两倍。

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

谢谢!

【问题讨论】:

标签: mysql transactions


【解决方案1】:

也许您可以创建一个触发器,当更新时余额

然后在查询中将 balance 更新为 balance -x,没有 where 子句,这会阻止 balance 更新到小于零

始终尝试先从一个帐户中取款,然后再将其存入另一个帐户。这在逻辑上也更有意义,因为您需要先从银行取钱,然后才能转移或购买东西。我不知道为什么你现在的顺序是相反的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-28
    • 2022-01-23
    • 2021-10-19
    • 1970-01-01
    • 2023-03-09
    • 2020-08-27
    • 2018-06-12
    • 1970-01-01
    相关资源
    最近更新 更多