龙行博客

走路看风景,经历看人生,岁月留痕迹,人生留轨迹,17的历史,18的豪情,时间的匆忙,人生的风景,放开心胸往前走,成功再远行,放开理想往前走,梦想再行动。
现在位置:首页 > 编程语言 > PHP > thinkphp5悲观锁解决并发超卖

thinkphp5悲观锁解决并发超卖

龙行    PHP    2019-7-9    44    0评论    本文已被百度收录点击查看详情
/**
 * thinkphp使用悲观锁。悲观锁需要配合事务一起使用
 * 商品表。购买数量为1,先锁定该商品,不让其他操作减库存。
 */
public function mysql_lock(){
    $num = 1;   //数量
    $goods_id = 1;   //商品id
    $model = \db('goods');
    $model->execute('set autocommit=0;');   //事物非自动提交
    $model->startTrans();
    //使用主键或者其他索引字段时为行级锁,否则为表级锁
    $where['id'] = $goods_id;
    $where['status'] = 1;
    $goods_info = $model->lock(true)->where($where)->find();
    if(empty($goods_info)){
        return '商品不存在';
    }
    $total = $goods_info['goods_num'];  //商品库存
    $sell = $goods_info['sell'];    //商品销量
    if($total<$num){
        return '库存不足';
    }
    $data['goods_num'] = $total-$num;
    $data['sell'] = $sell+$num;
    $res = $model->where(array('id'=>$goods_id))->update($data);
    if($res){
        $order_model = \db('orders');
        $order_data['uid'] = rand(1000,9999);
        $order_data['status'] = 1;
        $order_data['create_time'] = date('Y-m-d H:i:s');
        $order_res = $order_model->insert($order_data);
        if($order_res){
            $model->commit();
            return json(['code'=>1,'msg'=>'成功']);
        }else{

            $model->rollback();
            return json(['code'=>0,'msg'=>'失败']);
        }
    }else{

        $model->rollback();
        return json(['code'=>0,'msg'=>'失败']);
    }
    exit;

}


评论一下 分享本文 赞助站长

赞助站长X

扫码赞助站长
联系站长
龙行博客
  • 版权申明:此文如未标注转载均为本站原创,自由转载请表明出处《龙行博客》。
  • 本文网址:https://www.liaotaoo.cn/268.html
  • 上篇文章:thinkphp5使用redis
  • 下篇文章:thinkphp5伪静态配置
  • tp5
挤眼 亲亲 咆哮 开心 想想 可怜 糗大了 委屈 哈哈 小声点 右哼哼 左哼哼 疑问 坏笑 赚钱啦 悲伤 耍酷 勾引 厉害 握手 耶 嘻嘻 害羞 鼓掌 馋嘴 抓狂 抱抱 围观 威武 给力
提交评论

清空信息
关闭评论
快捷导航
联系博主
在线壁纸
给我留言
光羽影视
音乐欣赏
返回顶部