2020-09-02 14:13:22
在 Laravel 中处理并发请求和竞态条件,需结合数据库事务、锁机制及队列技术,针对不同业务场景选择合适策略。以下是具体方法及实现要点:
1. 数据库事务:保证数据一致性使用 DB::transaction() 方法自动处理提交与回滚。
若代码抛出异常,事务自动回滚。
通过 lockForUpdate() 方法实现行级锁。
必须配合事务使用,否则锁会立即释放。
手动实现:在数据表中添加 version 字段,更新时检查当前版本是否匹配。
Eloquent 替代方案:通过 update() 返回值判断影响行数。
手动版本控制:$product = Product::find($id);$currentVersion = $product->version;$updated = DB::table('products') ->where('id', $id) ->where('version', $currentVersion) ->update([ 'stock' => $product->stock - 1, 'version' => $currentVersion + 1 ]);if (!$updated) { // 处理失败(版本不匹配,可能已被其他请求修改)}
- Eloquent 判断影响行数: ```php $updated = DB::table('products') ->where('id', $id) ->where('stock', '>', 0) ->decrement('stock'); if (!$updated) { // 处理失败(可能已无库存或被其他请求占用) }使用 Redis 或 Database 作为队列驱动。
结合 Supervisor 管理队列进程。
Laravel 队列支持延迟、重试机制。
Laravel 处理并发请求和竞态条件的核心在于:
根据业务场景(如库存扣减、订单生成、数据同步)选择合适策略,可有效解决并发问题。