我试图弄清楚如何正确使用/测试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;
        }));
    }

10-04 11:45