You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Webhook重复请求处理:如何避免重复数据入库

解决Laravel Webhook并发重复数据问题

1. 数据库层面添加联合唯一索引(最核心)

从根源杜绝重复数据,给my_models表的service_id和param字段添加联合唯一索引,让数据库直接拦截重复的组合插入:

迁移文件示例

Schema::table('my_models', function (Blueprint $table) {
    $table->unique(['service_id', 'param']);
});

执行迁移后,任何重复的service_id+param组合都会触发数据库的唯一约束异常,从底层阻止重复数据生成。

2. 用Laravel原子方法替代手动判断

Laravel提供的updateOrCreate/firstOrCreate方法能最大化保证操作原子性,配合上面的唯一索引,可高效解决并发问题:

使用updateOrCreate实现更新/创建

MyModel::updateOrCreate(
    // 查询条件:匹配service_id和param
    ['service_id' => $request->service_id, 'param' => $request->param],
    // 需要更新或填充的字段
    [
        'status' => $request->status,
        'updated_at' => now()
    ]
);

该方法会先尝试按条件查询,找到数据则更新,找不到则创建。若并发请求同时触发创建,数据库会抛出唯一约束异常,只需捕获并忽略即可(此时另一请求已完成创建)。

捕获唯一约束异常示例

try {
    MyModel::updateOrCreate(
        ['service_id' => $request->service_id, 'param' => $request->param],
        ['status' => $request->status]
    );
} catch (\Illuminate\Database\QueryException $e) {
    // 判断是否为唯一索引冲突异常(错误码23000)
    if ($e->getCode() === '23000') {
        // 忽略异常,数据已由其他请求创建/更新
        return;
    }
    // 其他异常重新抛出
    throw $e;
}

3. 悲观锁+事务(适合严格控制场景)

若不想依赖异常处理,可使用数据库悲观锁在事务内锁定查询,确保同一时间只有一个请求能进入创建分支:

DB::transaction(function () use ($request) {
    // 加排他锁,其他请求需等待当前事务完成才能查询
    $model = MyModel::where('service_id', $request->service_id)
        ->where('param', $request->param)
        ->lockForUpdate()
        ->first();

    if ($model) {
        // 执行更新逻辑
        $model->update(['status' => $request->status]);
    } else {
        // 执行创建逻辑
        MyModel::create([
            'service_id' => $request->service_id,
            'param' => $request->param,
            'status' => $request->status
        ]);
    }
});

注意:悲观锁会增加数据库锁竞争,高并发场景下可能影响性能,需根据实际流量评估后使用。

方案优先级建议

优先选择联合唯一索引+updateOrCreate+异常捕获,该方案简洁高效,由数据库层面保障数据唯一性,性能损耗最低;若对异常处理有顾虑,再考虑悲观锁方案。

内容的提问来源于stack exchange,提问作者LoveCoding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 03:15:38