在处理两个并发请求同时更新同一条 MySQL 数据的情况时,你需要考虑并发冲突的问题,以确保数据的一致性和完整性。以下是一些解决方法:
在 Laravel 中,你可以使用数据库事务来处理并发更新。在事务中,你可以执行一系列操作,并在操作完成后提交或回滚事务。如果两个请求同时尝试更新相同的数据,一个请求会等待另一个请求完成后再执行。
use Illuminate\Support\Facades\DB;
public function syncNo(array $params)
{
DB::transaction(function () use ($params) {
// 锁定记录以防止其他请求同时更新
$collection = TestModel::where(['no' => $params['no']])
->lockForUpdate()
->first();
if (empty($collection)) {
return;
}
if (empty($collection->content)) {
$upd = ['content' => $params['content']];
} else {
$upd = ['content' => DB::raw("CONCAT(content, ',{$params['content']}')")];
}
Requisition::where('no', $params['no'])
->update($upd);
});
}
当一个请求使用 lockForUpdate
锁定记录时,其他并发请求将被阻塞,直到锁被释放。这意味着在并发情况下,第一个请求成功执行 lockForUpdate
后,第二个请求将等待锁被释放,而不会立即执行。
这是为了确保数据的一致性和完整性。当多个请求试图同时修改同一行数据时,使用锁定可以防止数据不一致或错误的更新。只有当第一个请求完成并释放锁时,其他等待的请求才会被执行。
所以,第二个请求会等待第一个请求完成后才会执行。这种行为是为了避免并发冲突和保障数据的一致性。
标签:laravel,请求,no,事务处理,content,并发,params,更新,MySQL From: https://www.cnblogs.com/pine007/p/17688660.html