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