PHP高并发

1:处理订单

  public function oneSecondSnap()
    {
        $user_id = 1;
        $goods_id = 1;
        $number = 1;
        $sql = "select count as number from food where id ='$goods_id' ";//解锁 此时ih_store数据中goods_id='$goods_id' and sku_id='$sku_id' 的数据被锁住(注3),其它事务必须等待此次事务 提交后才能执行
        $row = DB::select($sql);
        if ($row[0]->number > 0) {//高并发下会导致超卖
            $order_sn = $this->build_order_no();
            //生成订单
            $sql = "insert into orders(user_id,food_id,order_id)
            values('$user_id','$goods_id','$order_sn')";
            $order_rs = DB::insert($sql);
            //库存减少
            $sql = "update food set count = count - " . $number . " where id = '$goods_id'";
            $store_rs = DB::update($sql);
            Log::info('库存减少成功');

        } else {
            Log::info('库存不够');
        }
    }

    /**
     * 生成唯一订单
     */
    public function build_order_no()
    {
        return date('ymd') . substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
    }

2:使用jmeter开启多线程访问测试

具体操作请查看 https://blog.csdn.net/qq_29099209/article/details/79998731

3:查看分析结果

设置了产品为10个  0.1秒发起开启20个线程去请求购买,结果发现商品超卖


4:解决方案

https://blog.csdn.net/nuli888/article/details/51865401

猜你喜欢

转载自blog.csdn.net/qq_29099209/article/details/80057700