Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Laravel悲观锁无法正常工作_Mysql_Laravel_Eloquent - Fatal编程技术网

Mysql Laravel悲观锁无法正常工作

Mysql Laravel悲观锁无法正常工作,mysql,laravel,eloquent,Mysql,Laravel,Eloquent,我正在开发一个用于娱乐目的的小型购物网站,但我打算在将来将相同的代码应用于一个可能的真正的商店网站。 所以我有这些“吃角子老虎机”是要买的,比如一个预订的吃角子老虎机,用来保留有号码的座位。 所以人们会买吃角子老虎机并保留座位,但我面临着一个比赛条件问题,即使我使用lockForUpdate方法,我也可以买比我的平衡更多的吃角子老虎机。 当用户单击“购买”时,我的一段代码: 我将记录插槽数量,因为我将显示重定向后用户在视图上成功购买的插槽数量。 如果我截取请求并编辑它,比如说,4个请求,每个请求

我正在开发一个用于娱乐目的的小型购物网站,但我打算在将来将相同的代码应用于一个可能的真正的商店网站。 所以我有这些“吃角子老虎机”是要买的,比如一个预订的吃角子老虎机,用来保留有号码的座位。 所以人们会买吃角子老虎机并保留座位,但我面临着一个比赛条件问题,即使我使用lockForUpdate方法,我也可以买比我的平衡更多的吃角子老虎机。 当用户单击“购买”时,我的一段代码:

我将记录插槽数量,因为我将显示重定向后用户在视图上成功购买的插槽数量。
如果我截取请求并编辑它,比如说,4个请求,每个请求购买5个不同的插槽,我可以设法购买超过我的余额,我的余额变成负值。我在哪里搞砸了?

嗯,在$wallet上的lockForUpdate()呼叫后,你能尝试刷新$wallet吗?如果它有效,那么我将在回答中提供一个解释。您能确保钱包余额在
$wallet->update()
之后发生变化吗?我会在循环外取一次钱包,并确保余额得到更新。我会试试并更新你guys@andretzermias尝试在提交前再次检查余额是否已更改。仍然可以花比我更多的钱have@Shadow尝试检查钱包是否已成功更新,但仍然存在相同的问题。似乎lockForUpdate不起作用,因为请求同时出现
foreach ($tSlots as $mSlot) {
    DB::beginTransaction();
    $slot = Slots::where('id', $mSlot)->lockForUpdate()->first();
    $wallet = $user::getWallet();
    $wallet->lockForUpdate();
    if (($slot->user_id === null) && ($wallet->balance >= $slot->price)) {
        $wallet->balance -= $slot->price;
        $slot->user_id = $user->id;
        if ($wallet->update() && $slot->update()) {
            $counter++;
            DB::commit();
        } else {
            DB::rollBack();
        }
    } else {
        DB::rollBack();
    }
}