mysql 防止超卖的代码示例

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

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();
        }

    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fish_study_csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值