- /**
- * 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;
- }
上一篇:
thinkphp6官方上传验证问题
下一篇:
php根据访问者ip确定所属地区信息
友情提示:垃圾评论一律封号...