php - Laravel lockforupdate(悲观锁)

标签 php mysql laravel laravel-5 pessimistic-locking

我正在尝试弄清楚如何正确使用/测试 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 并且记录被更新(在浏览器 1 的 60 秒锁定触发内)

但是60秒后,记录又被浏览器1修改了(点100000)

所以我误解了 lockforupdate 的用途?还是我测试不正确?

我期望的是在前 60 秒内不应由浏览器 2 修改该行(加载图标或错误抛出的空白页面?)

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

关于php - Laravel lockforupdate(悲观锁),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34556511/

相关文章:

php - selenium 2 无法连接到主机

不允许重复时 MySQL 多次插入。

php - 拉拉维尔。其他数据库中的用户注册

laravel - Tymon\JWTAuth::toUser 错误:需要 token

php - Composer 更新在我的情况下不起作用

javascript - 我的用户可以通过单击缺少 Ajax 的按钮来访问 $_SESSION 的内容吗?

PHP - 使图像背景透明并具有容差

php - 将 IP 地址重定向到 PHP 网页

c# - 如何安全地创建一个查询,该查询将列出给定表名的列名以及可能指向 SQL Server 或 MySQL 的连接字符串?

javascript - PHP 中的 Javascript 数组