laravel 通过事务处理两个并发请求同时更新同一条 MySQL 数据
在处理两个并发请求同时更新同一条 MySQL 数据的情况时,你需要考虑并发冲突的问题,以确保数据的一致性和完整性。以下是一些解决方法:
在 Laravel 中,你可以使用数据库事务来处理并发更新。在事务中,你可以执行一系列操作,并在操作完成后提交或回滚事务。如果两个请求同时尝试更新相同的数据,一个请求会等待另一个请求完成后再执行。
copyuse 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
后,第二个请求将等待锁被释放,而不会立即执行。
这是为了确保数据的一致性和完整性。当多个请求试图同时修改同一行数据时,使用锁定可以防止数据不一致或错误的更新。只有当第一个请求完成并释放锁时,其他等待的请求才会被执行。
所以,第二个请求会等待第一个请求完成后才会执行。这种行为是为了避免并发冲突和保障数据的一致性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2020-09-08 laravel中distinct()的使用方法与去重(转)