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

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

это просто тестирование

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

return $model;
}));
}

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

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

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

поэтому я неправильно понимаю, что lockforupdate используется для? или я проверяю его неправильно?

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

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

и я провел некоторые исследования, но до сих пор не могу понять, что отличается между sharedLock (LOCK IN SHARE MODE) и lockForUpdate (FOR UPDATE)

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

6

Решение

Эта работа, наконец, но до сих пор не понимаю, что разделяют sharedLock (LOCK IN SHARE MODE) и lockForUpdate (FOR UPDATE)

    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;
}));
}
11

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]