php-并发编程那点事(一)

    在互联网项目开发中,我们经常会用这样一种方案去解决业务问题,就是查询再判断,比如电商中的购买商品,你先查询当前用户的余额(平台余额,不考虑直接第三方支付),然后再根据购买商品的单价和数量得出一个购买总额,这样如果余额大于或等于购买总额,则生成购买订单等等一系列业务逻辑操作,在这个过程中,如果一旦遇到并发操作,这个人通过非正常访问,同时100个并发进行,那么这100个请求同时执行查询余额的代码(理论上),当然查询的结果也会保持一致,这样判断也会全部通过,就会生成100个订单,也会造成用一件商品的钱购买了多件商品。伪代码如下(伪代码随便写的,不要介意)
<?php
class Product {

    public function buy($productId, $count, $uid) {
        $sql = "select * from user_account where uid = ". $uid;
        $userAccount = $db->exec($sql);
        $sql = "select * from product where id = ".$productId;
        $product = $db->exec($sql);
        if ($userAccount['account'] >= $product['account'] * $count) { // 判断当余额是否大于购买金额
            # 执行业务逻辑
        }
        // ............
    }

}

    如何避免这些问题,假设我们没有其它中间件,只有php+mysql,如何去解决呢?

    我这边给出的思路是:先查询购买总额,然后用update user_account set account = account - $account where account>=$account and uid = $uid, 然后判断受影响的行数,如果等于1 就生成资金冻结订单,再生成购买订单,当然购买订单和冻结订单应有外键关系,这样当购买失败时(库存不够等异常),就可以将资金解冻回到用户余额。这里伪代码就不写了。

     希望对初学者有所帮助,写的不好请谅解,如有错误请多多指教。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值