я пытаюсь выяснить, как правильно использовать / проверить 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
Эта работа, наконец, но до сих пор не понимаю, что разделяют 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;
}));
}
Других решений пока нет …