【发布时间】:2018-06-16 04:20:48
【问题描述】:
所以这是我的场景,假设我正在制作一个在线购物平台。并且我的用户在user_balance 字段或表中有100 的余额。
现在,用户,打开withdrawal page 让他们withdraw money 和shopping page 让他到buy a watch of 100 dollar with one click
假设用户提现 100 美元,同时以 100 美元购买手表。
我的问题是SELECT user_balance FROM balances FOR UPDATE 会同时执行还是会等待其他人完成选择。
如果两个SELECT...FOR UPDATE 同时执行,user_balance 将在两个页面上显示100,因此,它将允许撤回100 并购买100 的手表,因此,当我们终于更新了用户的余额,它会显示负余额
100(user balance) - 100(withdrawal amount) - 100(purchasing of watch) = -100
这是两个页面的代码概念:
提款页面:
$withdrawal_amount = 100;
$user_balance = "SELECT user_balance FROM balances FOR UPDATE"; //actually return 100?(not sure about it, that is what my question about)
if($user_balance > $withdrawal_amount){
//allow withdrawal
$update_sql_query = "UPDATE balances SET user_balance = user_balance - " . $withdrawal_amount;
}
购买观看页面:
$product_subtotal = 100;
$user_balance = "SELECT user_balance FROM balances FOR UPDATE"; //actually return 100?(not sure about it, that is what my question about)
if($user_balance > $product_subtotal){
//allow withdrawal
$update_sql_query = "UPDATE balances SET user_balance = user_balance - " . $product_subtotal;
}
【问题讨论】:
-
快速回答,由于并发,mysql 应该会阻止您出现 -100。有关更多详细信息,请阅读此stackoverflow.com/questions/4828490/… 链接,其中讨论了 Mysql 中的并发
-
@SteveB 您好,感谢您的评论,我已经更新了我的问题,我不确定两个页面的 user_balance 是否相同。如果是,我该怎么做才能防止这种情况发生
-
到目前为止提供的答案并未解决您的最后一个问题。防止两个页面显示相同信息的唯一方法是只允许一次登录。另一种选择是让页面自动更新,因此一旦值更改,第二个页面也会更新,可能使用推送功能。
-
@SteveB 如果两者都在前端显示相同的信息,则可以。我唯一担心的是后端出现问题时