超卖

作者: BenjaminCool | 来源:发表于2019-01-06 15:32 被阅读5次

mysql处理高并发,防止库存超卖


从技术方面剖析,很多人肯定会想到事务,但是事务是控制库存超卖的必要条件,但不是充分必要条件。

举例:

总库存:4个商品

请求人:a、1个商品 b、2个商品 c、3个商品

程序如下:

beginTranse(开启事务)

try{

    $result = $dbca->query('select amount from s_store where postID = 12345');

    if(result->amount > 0){

        //quantity为请求减掉的库存数量

        $dbca->query('update s_store set amount = amount - quantity where postID = 12345');

    }

}catch($e Exception){

    rollBack(回滚)

}

commit(提交事务)

以上代码就是我们平时控制库存写的代码了,大多数人都会这么写,看似问题不大,其实隐藏着巨大的漏洞。数据库的访问其实就是对磁盘文件的访问,数据库中的表其实就是保存在磁盘上的一个个文件,甚至一个文件包含了多张表。例如由于高并发,当前有三个用户a、b、c三个用户进入到了这个事务中,这个时候会产生一个共享锁,所以在select的时候,这三个用户查到的库存数量都是4个,同时还要注意,mysql innodb查到的结果是有版本控制的,再其他用户更新没有commit之前(也就是没有产生新版本之前),当前用户查到的结果依然是旧版本;

然后是update,假如这三个用户同时到达update这里,这个时候update更新语句会把并发串行化,也就是给同时到达这里的是三个用户排个序,一个一个执行,并生成排他锁,在当前这个update语句commit之前,其他用户等待执行,commit后,生成新的版本;这样执行完后,库存肯定为负数了。但是根据以上描述,我们修改一下代码就不会出现超买现象了,代码如下:

beginTranse(开启事务)

try{

    //quantity为请求减掉的库存数量
    $dbca->query('update s_store set amount = amount - quantity where postID = 12345');

    $result = $dbca->query('select amount from s_store where postID = 12345');

    if(result->amount < 0){

       throw new Exception('库存不足');

    }

}catch($e Exception){

    rollBack(回滚)

}

commit(提交事务)



另外,更简洁的方法:

beginTranse(开启事务)

try{

    //quantity为请求减掉的库存数量
    $dbca->query('update s_store set amount = amount - quantity where amount>=quantity and postID = 12345');

}catch($e Exception){

    rollBack(回滚)

}

commit(提交事务)


相关文章

  • 超卖和超卖

    超买: 买方力量基本用尽,股价即将下跌。 超卖: 卖方不能再卖了。 除息:股票发行在发放股息或红利时,需要事先进行...

  • B2B2C商城和ERP对接中的超卖问题

    1.什么是超卖问题? 商城平台中超卖问题是经常发生的,那什么是超卖问题?超卖问题就是已售商品库存 > 实际库存,现...

  • 超卖

    mysql处理高并发,防止库存超卖

  • 超卖

    秒杀除开⾼并发⾼流量下的服务稳定性之外,剩下的核⼼⼤概就是怎么保证库存不超卖了,也可以说要保证的是最终⼀致性。⼀般...

  • 业务场景实战(一)美团到家商品库存演进

    目录 系列总目录 架构演进防超售单元化平台化 防超卖Mysql同步实现防超卖Redis同步实现防超卖 一致性Mys...

  • 【优化技术专题】「系统性能调优实战」秒杀系统相关的设计和相关注意

    秒杀应该考虑哪些问题 超卖问题 分析秒杀的业务场景,最重要的有一点就是超卖问题,假如备货只有100个,但是最终超卖...

  • 【分布式技术专题】「架构设计方案」盘点和总结秒杀服务的功能设计及

    秒杀应该考虑哪些问题 超卖问题 分析秒杀的业务场景,最重要的有一点就是超卖问题,假如备货只有100个,但是最终超卖...

  • 2021-04-15 RSI线(1)

    RSI是超卖超买指标。0-30 超卖,止跌,后续会上涨,但上涨需要看KDJ线30-50卖出正常,继续跌,结合KDJ...

  • 超卖问题

    1.当库存还剩一个时,同一个数据AB同时来访问时就会超卖问题。 数据库深层是:同一个数据,对于数据库来说加了隐式锁...

  • 超卖问题

    原因 两个人同时购买同一件商品,会产生超卖问题。 解决 表设计无符号的表设计(unsigned)。在设计表的时候,...

网友评论

      本文标题:超卖

      本文链接:https://www.haomeiwen.com/subject/qunkfqtx.html