【发布时间】:2017-07-24 10:23:39
【问题描述】:
如何防止发生这种竞争情况?我知道 Laravel 中的事务正在阻止更新,但是如何防止使用过时的数据?有没有办法在另一个事务正在进行时锁定数据库以防止读取? (即让第二个请求等待第一个请求完成?)
假设数据库中主键 id = 7 的用户名字段为空。
请求 1 进来并执行此操作:
public function raceCondition1() {
DB::beginTransaction();
//Get the model with primary key 7
$user = User::findorfail(7);
sleep(6);
$user->username = 'MyUsername';
$user->save();
DB::commit();
}
两秒后,我运行请求 2,它只是将一些内容连接到用户名列并保存:
public function raceCondition2() {
DB::beginTransaction();
$user = User::findorfail(7);
sleep(6);
$user->username = 'USER_' . $user->username;
$user->save();
DB::commit();
}
本例在数据库中的结果是:USER_
在第一个请求之前从数据库读取的第二个请求可以保存,并且使用了陈旧的 NULL 值。有没有办法在另一个事务正在进行时锁定数据库以防止读取? (即让第二个请求等待第一个请求完成?)
【问题讨论】:
标签: php sql database laravel transactions