2016-05-07 52 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子句這將阻止更新爲小於零

總是試圖拿錢出來的帳戶的第一把在另一個之前的平衡帳戶。它在邏輯上也更有意義,因爲您需要在銀行轉賬或購買東西之前從銀行取錢。我不知道你爲什麼以相反的順序現在。