Laravel公共API高并发请求导致主键重复的解决方法咨询
Laravel公共API高并发下主键重复冲突的解决问题
背景
Stack Overflow上已有不少关于Laravel避免重复记录的讨论,但均未覆盖公共API场景,相关讨论主题包括:
- How to handle QueryException for duplicate entries in Laravel
- Laravel - Prevent multiple requests at the same time creating duplicate records
- how to avoid duplicate entry in Laravel
我开发的公共Laravel API支持创建客户、商品、发票等数据,端点每秒会被多次请求,部分开发者因循环逻辑错误,会触发MySQL报错:
#1062 - Duplicate entry for key 'PRIMARY'
- 当前已有数十个实体在使用该API,用户量预计会大幅增长。
已尝试方案及遇到的问题
为避免MySQL报错,我添加了自定义数据库事务中间件,将所有API请求纳入事务:响应状态码为200时提交事务,否则回滚。
中间件代码
class CustomDBTransaction { public function handle($request, Closure $next) { DB::beginTransaction(); $response = $next($request); if ($response->getStatusCode() == 200) DB::commit(); else DB::rollBack(); return $response; } }
中间件注册(Kernel.php)
'api' => [ 'throttle:60,1', \Illuminate\Routing\Middleware\SubstituteBindings::class, \App\Http\Middleware\CustomDBTransaction::class, ],
通过Postman压测后发现:该事务确实阻止了MySQL报错,但即使请求数据格式完全正确,端点也无法正常执行。
另外,throttle限流无法解决问题:即便限制每秒60次请求,多用户同时访问仍可能出现主键冲突。
求助
请问该如何缓解公共Laravel API高并发下的主键重复冲突问题?
内容的提问来源于stack exchange,提问作者Linesofcode
相关产品推荐
相关产品推荐

