訂單高併發超賣解決方案(PHP)

<?php
//優化方案:將庫存字段number字段設爲unsigned,判斷庫存字段number減去購買量時,當庫存小於0,將會返回false
include('./mysql.php');
$username = 'wang'.rand(0,1000);
//生成唯一訂單
function build_order_no(){
  return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}
//記錄日誌
function insertLog($event,$type=0,$username){
    global $conn;
    $sql="insert into ih_log(event,type,usernma)
    values('$event','$type','$username')";
    return mysqli_query($conn,$sql);
}
function insertOrder($order_sn,$user_id,$goods_id,$sku_id,$price,$username,$number)
{
      global $conn;
      $sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price,username,number)
      values('$order_sn','$user_id','$goods_id','$sku_id','$price','$username','$number')";
     return  mysqli_query($conn,$sql);
}
//模擬下單操作
//庫存是否大於0
$sql="select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id' ";
$rs=mysqli_query($conn,$sql);
$row = $rs->fetch_assoc();
  if($row['number']>0){//高併發下會導致超賣
      if($row['number']<$number){
        return insertLog('庫存不夠',3,$username);
      }
      $order_sn=build_order_no();
      //庫存減少
      $sql="update ih_store set number=number-{$number} where sku_id='$sku_id' and (number-{$number})>=0";
      $store_rs=mysqli_query($conn,$sql);
      if($store_rs){
          //生成訂單
          insertOrder($order_sn,$user_id,$goods_id,$sku_id,$price,$username,$number);
          insertLog('庫存減少成功',1,$username);
      }else{
          insertLog('庫存減少失敗',2,$username);
      }
  }else{
      insertLog('庫存不夠',3,$username);
  }
?>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章