我正在尝试弄清楚如何正确地使用/测试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;
}));
}
我尝试在两个浏览器中测试,浏览器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。