// 抢购下单
public function goodsOrder()
{
$redis = self::Redis();
$db = self::mysql();
$goodsId = 1;
$sql = "select id,inventory,price from hw_goods where id=".$goodsId;
$stmt = $db->query($sql);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$redis = self::Redis();
$count = $redis->rpop('num');//每次从num取出1
if($count == 0){
$this->log(0, 'no num redis');
echo '已没有库存';
} else {
$this->doOrder($row, 1);
}
}
如果redis队列数量变成0了,就是没有库存了,这个时候不做订单处理了,如果不是0就要更新库存,生成订单。
public function doOrder($goods, $goodsNum)
{
$orderNo = $this->orderNo();
$number = $goods['inventory'] - $goodsNum;
if ($number < 0) {
$this->log(0, '已没有库存');
echo '已没有库存';
return false;
}
$db = self::mysql();
try {
$db->beginTransaction(); //启动事务
$sql = "INSERT INTO `hw_order` (user_id,order_sn,status,goods_id,o_num,price,created_at) VALUES (:user_id,:order_sn,:status,:goods_id,:sku_id,:o_num,:price,:created_at)";
$stmt = $db->prepare($sql);
$stmt->execute([
':user_id' => rand(1, 500),
':order_sn' => $orderNo,
':status' => 1,
':goods_id' => $goods['id'],
':o_num' => $goodsNum,
':price' => $goods['price'] * 100,
':created_at' => date('Y-m-d H:i:s'),
]);
$sql2 = "update hw_goods set inventory=inventory-".$goodsNum." where inventory>0 and id=".$goods['id'];
$res = $db->exec($sql2);
$db->commit(); //提交事务
$this->log(1, '下单和库存扣减成功');
} catch (Exception $e) {
$db->rollBack(); //回滚事务
$this->log(0, '下单失败');
}
}
这样就ok,整体逻辑比较简单,实现方法也比较简单。当变为0之后,就可以返回给用户其他等待页面了。