Laravel悲观锁无法正常工作

时间:2018-10-14 20:48:10

标签: mysql laravel eloquent

我正在开发一个用于娱乐目的的小型购物网站,但我打算将来将相同的代码应用于可能的真实商店网站。 因此,我有这些要购买的“插槽”,例如用于保存带数字席位的预订插槽。 因此,人们会购买插槽并保存座位,但是我面临着竞争状况的问题,即使我使用的是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个不同的老虎机,那么我可以购买的余额超过了我的余额,而余额变成了负数。我在哪里弄乱了?

0 个答案:

没有答案