Laravel пессимистический замок не работает, как предполагалось - PullRequest
0 голосов
/ 14 октября 2018

Я разрабатываю небольшой торговый сайт для развлекательных целей, но в будущем собираюсь применить этот же код к возможному реальному веб-сайту магазина.Таким образом, у меня есть эти «слоты», которые должны быть куплены, как слот для резервирования мест с номерами.Поэтому люди будут покупать слоты и экономить места, но я столкнулся с проблемой состояния гонки, хотя я использую метод 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 разных слотов, я могу купить больше, чем у меня есть баланс, и мой баланс становится отрицательным.Где я все испортил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...