要实现防止超卖功能,常见思路有redis原子锁、mysql悲观锁(for update)、mysql乐观锁(version)、文件锁等。
以下测试为线上环境,2核4G带宽4M.商品总数6万,每笔订单只消耗1件商品。
// 下单逻辑
$goodsList = TestingGoods::all();
foreach($goodsList as $goods) {
// 模拟高并发抢购
$orderCreatingRequest->query->set('goods_id', $goods->id);
foreach(range(1, 10000) as $userId) {
$orderCreatingRequest->query->set('user_id', $userId);
$result = app(TestController::class)->createOrderOversale($orderCreatingRequest);
print_r($result->original);
echo PHP_EOL;
}
}
// 库存逻辑
public function createOrderOversale(Request $request)
{
DB::beginTransaction();
$goods = TestingGoods::find($goodsId);
if ($goods->num < 1){
DB::rollBack();
return $this->response->json(['status' => 'error', 'msg' => '库存不足,下单失败']);
exit();
}
}
此方案并没有起到限制商品超卖功能,一共发起21万次请求,生成21万笔订单。