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 后,第二个请求将等待锁被释放,而不会立即执行。

这是为了确保数据的一致性和完整性。当多个请求试图同时修改同一行数据时,使用锁定可以防止数据不一致或错误的更新。只有当第一个请求完成并释放锁时,其他等待的请求才会被执行。

所以,第二个请求会等待第一个请求完成后才会执行。这种行为是为了避免并发冲突和保障数据的一致性。

posted @   pine007  阅读(499)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2020-09-08 laravel中distinct()的使用方法与去重(转)
点击右上角即可分享
微信分享提示