1 不枷锁会超卖的现象
public function overBuy(){
$good = new Goods();
$good = $good->get(9);
$log = new Log();
if ($good->total > 0) {
$good->total = $good->total - 1;
$good->save();
$data= [
'activeid'=>9,
'users_id'=>9999,
'handle'=>'overBuy',
'result'=>"购买了商品",
'ip'=>'127.0.0.1',
'status'=>1
];
$data['details'] = json_encode($data);
$log->save($data);
// $this->log->info(date("Y-m-d H:i:s") . ",购买了商品!");
} else {
$data= [
'activeid'=>9,
'users_id'=>9999,
'handle'=>'overBuy',
'result'=>"商品已卖完",
'ip'=>'127.0.0.1',
'status'=>2
];
$data['details'] = json_encode($data);
$log->save($data);
// $this->log->info(date("Y-m-d H:i:s") . ",商品已卖完!");
}
}
2:加悲观锁不会超卖:
public function unOverBuy(){
$good = new Goods();
$log = new Log();
$db = $good->db(false);
$db->startTrans();
try {
$good = $good->lock(true)->get(9);
if ($good->total > 0) {
$good->total = $good->total - 1;
$good->save();
$data= [
'activeid'=>9,
'users_id'=>9999,
'handle'=>'overBuy',
'result'=>"购买了商品",
'ip'=>'127.0.0.1',
'status'=>1
];
$data['details'] = json_encode($data);
$log->save($data);
$db->commit();
} else {
$db->rollback();
$data= [
'activeid'=>9,
'users_id'=>9999,
'handle'=>'overBuy',
'result'=>"商品已卖完",
'ip'=>'127.0.0.1',
'status'=>2
];
$data['details'] = json_encode($data);
$log->save($data);
}
}catch (Exception $e){
echo $e->getMessage();
}
}

本文对比了不使用锁和使用悲观锁两种情况下商品购买过程的实现方式。未使用锁时,存在并发购买导致的商品数量超卖风险;而采用悲观锁则有效避免了这一问题,确保了库存准确。
888

被折叠的 条评论
为什么被折叠?



