美文网首页小蒋同学
MySQL 处理高并发 防止库存超卖

MySQL 处理高并发 防止库存超卖

作者: 小蒋同学v | 来源:发表于2019-11-16 19:11 被阅读0次

问题描述

一般电子商务网站都会遇到如团购、秒杀、特价之类的活动,而这样的活动有一个共同的特点就是访问量激增、上千甚至上万人抢购一个商品。

然而,作为活动商品,库存肯定是很有限的,如何控制库存不让出现超卖,以防止造成不必要的损失,是众多电子商务网站程序员头疼的问题,这同时也是最基本的问题。

条件

总库存:4个商品
请求人:a、1个商品 b、2个商品 c、3个商品

错误示例

$pdo->beginTransaction();
try{
    $result = $pdo->query('select amount from s_store where postID = 12345');
    if($result->amount > 0){
        // quantity 为请求减掉的库存数量
        $pdo->query('update s_store set amount = amount - quantity where postID = 12345');
    }
    // 没有错误则提交事务
    $pdo->commit();
}catch($e \PDOException){
    // 遇到错误则回滚事务
    $pdo->rollBack();
    echo "Failed: " . $e->getMessage();
}

使用 SELECT ... FOR UPDATE

$pdo->beginTransaction();
try{
    // 使用 SELECT ... FOR UPDATE 将此行数据锁住,在提交事务或者回滚事务时自动解开。
    $result = $pdo->query('select amount from s_store where postID = 12345 for update');
    if($result->amount < 0){
        // 抛出异常
        throw new \PDOException('库存不足');
    }
    // quantity 为请求减掉的库存数量
    $pdo->query('update s_store set amount = amount - quantity where postID = 12345');
    // 没有错误则提交事务
    $pdo->commit();
}catch($e \PDOException){
    // 遇到错误则回滚事务
    $pdo->rollBack();
    echo "Failed: " . $e->getMessage();
}

其他方法

$pdo->beginTransaction();
try{
    // quantity 为请求减掉的库存数量
    $pdo->query('update s_store set amount = amount - quantity where postID = 12345');
    $result = $pdo->query('select amount from s_store where postID = 12345');
    if($result->amount < 0){
        // 抛出异常
        throw new \PDOException('库存不足');
    }
    // 没有错误则提交事务
    $pdo->commit();
}catch($e \PDOException){
    // 遇到错误则回滚事务
    $pdo->rollBack();
    echo "Failed: " . $e->getMessage();
}

相关文章

  • 超卖

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

  • MySQL 处理高并发 防止库存超卖

    问题描述 一般电子商务网站都会遇到如团购、秒杀、特价之类的活动,而这样的活动有一个共同的特点就是访问量激增、上千甚...

  • php+redis消息队列实现抢购功能

    实现功能: 基于redis队列,防止高并发的超卖 基于mysql的事务加排它锁,防止高并发的超卖基于redis队列...

  • 秒杀设计

    防止库存超卖 用户少,并发少: 直接使用商品上下架的功能来实现秒杀。(直接读库) 用户量大,并发高: redis设...

  • JAVA-每日一面 2022-01-14

    问:高并发系统如何做性能优化?如何防止库存超卖?答: 高并发系统性能优化:优化程序,优化服务配置,优化系统配置1....

  • 高并发场景-订单库存防止超卖

    背景 在电商系统中买商品过程,先加入购物车,然后选中商品,点击结算,即会进入待支付状态,后续支付。过程需要检验库存...

  • 商城抢购秒杀防止库存超卖方法

    PHP-MALL 1.商城抢购,秒杀库存超卖是比较头疼的事,下面使用三种方法防止超卖 1.1.mysql锁机制,悲...

  • 高并发项目 redis解决库存问题

    高并发单体项目 库存问题 1. 简单的业务逻辑需求 bug:在高并发中多个用户会超卖 2. 使用java 内置锁 ...

  • go-zero基础组件-分布式锁RedisLock

    为什么需要分布式锁 用户下单 锁住uid,防止重复下单。 库存扣减 锁住库存,防止超卖。 余额扣减 锁住账户,防止...

  • 用 Go + Redis 实现分布式锁

    为什么需要分布式锁 用户下单 锁住 uid,防止重复下单。 库存扣减 锁住库存,防止超卖。 余额扣减 锁住账户,防...

网友评论

    本文标题:MySQL 处理高并发 防止库存超卖

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