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