laravel 通过事务处理两个并发请求同时更新同一条 MySQL 数据

在处理两个并发请求同时更新同一条 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 后,第二个请求将等待锁被释放,而不会立即执行。

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

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

posted @ 2023-09-08 22:13  pine007  阅读(294)  评论(0编辑  收藏  举报