我试图弄清楚如何正确使用/测试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刷新,然后将进行lockforupdate并在更新之前休眠60秒
在60秒内,我进入浏览器2并单击刷新,但是记录未锁定,我检查phpmyadmin并更新了记录(在浏览器1触发的60秒内锁定)
但60秒后,该记录已被浏览器1再次修改(点100000)
所以我误解了lockforupdate的用途?还是我测试不正确?
我预期的是在前60秒内不应由浏览器2修改该行(带有加载收藏夹图标或错误抛出的空白页面?)
https://laravel.com/docs/5.2/queries#pessimistic-locking
我做了一些研究,但仍然无法理解sharedLock(在共享模式下锁定)和lockForUpdate(用于更新)之间的区别
顺便说一句我确认数据库是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;
}));
}