防止超卖之一 - 不做处理

73 阅读1分钟

要实现防止超卖功能,常见思路有redis原子锁、mysql悲观锁(for update)、mysql乐观锁(version)、文件锁等。

以下测试为线上环境,2核4G带宽4M.商品总数6万,每笔订单只消耗1件商品。

image.png

// 下单逻辑
$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万笔订单。