я пытаюсь понять, как правильно использовать/проверить блокировку для обновления, но я обнаружил, что это не работает так, как я ожидал
это просто тестирование
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 секунд (пустая страница с загрузкой значка или ошибка?)
https://laravel.com/docs/5.2/queries#pessimistic-locking
и я провел некоторое исследование, но до сих пор не могу понять, в чем разница между sharedLock (LOCK IN SHARE MODE) и lockForUpdate (FOR UPDATE)
Кстати, я подтвердил, что база данных - это innodb