Laravel lockforupdate (пессимистическая блокировка)

Я пытаюсь выяснить, как правильно использовать/тестировать lockforupdate, но я обнаружил, что это не функция, как я ожидал

это просто испытания

public function index() {
        return dd(DB::transaction(function() {
            if (Auth::guard('user')->check()) {
                $model = AppModelsUser::find(1)->lockForUpdate();
                sleep(60);
                $model->point = 100000;
                $model->save();
            } else {
                $model = AppModelsUser::find(1);
                $model->point = 999;
                $model->save();
            }

            return $model;
        }));
}

Я пытаюсь проверить в браузере 2, браузер 1 пользователь вошел в систему и браузер 2 не вошел в систему, браузер 1 нажмите Обновить, затем будет lockforupdate и спать за 60 секунд до обновления

в 60 секундах я иду в браузер 2 и нажимаю refresh, однако запись не заблокирована, я проверяю phpmyadmin и запись обновляется (в течение 60 секунд блокировки триггера браузером 1)

но через 60 секунд запись снова была изменена браузером 1 (Точка 100000)

Так я непонимая lockforupdate польза для?или я тестирую неправильно?

Я ожидал, что строка не должна быть изменена браузером 2 в первые 60 секунд(пустая страница с загрузкой favicon или ошибкой бросить?)

https://laravel.com/docs/5.2/queries#pessimistic-locking

и я сделал некоторые исследования, но до сих пор не могу понять, что отличается между sharedLock(блокировка в режиме общего доступа) и lockForUpdate(для обновления)

кстати, я подтвердил, что база данных innodb

1 ответов


эта работа, наконец, но до сих пор не понимаю, что sharedLock(блокировка в режиме общего доступа) и lockForUpdate(для обновления) разные

    public function index() {
        return dd(\DB::transaction(function() {
            if (\Auth::guard('user')->check()) {
                $model = \App\Models\User::lockForUpdate()->find(1);
                sleep(30);
                $model->point = 100000;
                $model->save();
            } else {
                $model = \App\Models\User::lockForUpdate()->find(1);
                $model->point = $model->point + 1;
                $model->save();
            }

            return $model;
        }));
    }