首页 > 解决方案 > PHP mysql数据库两个请求同时在同一张表上

问题描述

如果用户调用两个请求,检查用户余额然后执行余额操作怎么办。它会引起任何问题吗?例如这两个代码:

$user = User::find(1);
if($user['balance']>250) {
    // Here for example long loop
    $user->update([
        'balance' => DB:raw('balance - 100')
    ]);
}

第二个脚本做类似的事情。可以是这样的情况:在第一个请求中,如果语句通过,然后执行长循环,同时第二个请求运行,其中有 if 检查余额,并且$user->update()在第一个请求中执行这个 if 之前执行,所以用户可以通过 if 语句当他没有平衡?

标签: phpmysqlsql

解决方案


是的,可能是这样的情况。为避免这种情况,请使用LOCK/UNLOCK TABLE

$user = User::find(1);
if($user['balance']>250) {
    User::lockTable(); // method name/use depends on your framework
    // Here for example long loop
    $user->update([
        'balance' => DB:raw('balance - 100')
    ]);
    User::unlockTable();
}

推荐阅读