laravel悲观锁不能正常工作

w8biq8rn  于 2021-06-18  发布在  Mysql
关注(0)|答案(0)|浏览(199)

我正在开发一个小型购物网站的娱乐目的,但我打算应用相同的代码到一个可能的真正的商店网站在未来。所以我有这些“空位”是要买的,比如一个预订空位,用数字来节省座位。所以人们会购买插槽和节省座位,但我面临着一个竞赛条件的问题,即使我使用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();
    }
}

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

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题