导读:本期聚焦于小伙伴创作的《SQL存储过程如何处理高并发下的库存扣减?使用原子更新与悲观锁》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《SQL存储过程如何处理高并发下的库存扣减?使用原子更新与悲观锁》有用,将其分享出去将是对创作者最好的鼓励。

高并发场景下库存扣减的核心诉求是保证库存操作的原子性和一致性,避免出现超卖或者库存扣减后未实际下单的问题。SQL存储过程可以将扣减逻辑封装在数据库端执行,减少应用与数据库的交互次数,结合原子更新和悲观锁可以有效应对高并发的库存操作需求。

SQL存储过程如何处理高并发下的库存扣减?使用原子更新与悲观锁

原子更新方案实现

原子更新的核心思路是利用SQL语句本身的原子性,在更新语句中直接判断库存是否充足,只有库存足够时才执行扣减操作,整个过程由数据库引擎保证原子性,不需要额外的锁机制。

存储过程实现

下面以MySQL为例,编写原子更新方式的库存扣减存储过程:

DELIMITER //
CREATE PROCEDURE deduct_stock_atomic(
    IN p_product_id INT, -- 商品ID
    IN p_deduct_num INT, -- 扣减数量
    OUT p_result INT -- 返回结果:1成功 0库存不足 -1参数错误
)
BEGIN
    DECLARE v_current_stock INT DEFAULT 0;
    -- 参数校验
    IF p_product_id <= 0 OR p_deduct_num <= 0 THEN
        SET p_result = -1;
    ELSE
        -- 原子更新库存,只有库存大于等于扣减数量时才执行
        UPDATE product_stock 
        SET stock_num = stock_num - p_deduct_num 
        WHERE product_id = p_product_id AND stock_num >= p_deduct_num;
        -- 判断更新影响的行数
        IF ROW_COUNT() > 0 THEN
            SET p_result = 1;
        ELSE
            SET p_result = 0;
        END IF;
    END IF;
END //
DELIMITER ;

方案优缺点

  • 优点:实现简单,不需要额外的锁操作,性能较高,适合并发量中等、库存扣减逻辑简单的场景。
  • 缺点:如果扣减逻辑除了更新库存还需要关联其他表操作,原子更新的方式难以保证多表操作的原子性。

悲观锁方案实现

悲观锁的核心思路是假设并发冲突概率高,在操作库存记录前先对记录加排他锁,其他事务需要等待锁释放才能操作同一条记录,从而保证同一时间只有单个事务处理该商品的库存。

存储过程实现

同样以MySQL为例,使用SELECT ... FOR UPDATE实现悲观锁的库存扣减存储过程:

DELIMITER //
CREATE PROCEDURE deduct_stock_pessimistic(
    IN p_product_id INT, -- 商品ID
    IN p_deduct_num INT, -- 扣减数量
    OUT p_result INT -- 返回结果:1成功 0库存不足 -1参数错误
)
BEGIN
    DECLARE v_current_stock INT DEFAULT 0;
    -- 参数校验
    IF p_product_id <= 0 OR p_deduct_num <= 0 THEN
        SET p_result = -1;
    ELSE
        -- 开启事务,对目标库存记录加排他锁
        START TRANSACTION;
        -- 查询当前库存并加锁,注意这里要显式指定主键条件触发行锁
        SELECT stock_num INTO v_current_stock 
        FROM product_stock 
        WHERE product_id = p_product_id FOR UPDATE;
        -- 判断库存是否充足
        IF v_current_stock >= p_deduct_num THEN
            UPDATE product_stock 
            SET stock_num = stock_num - p_deduct_num 
            WHERE product_id = p_product_id;
            SET p_result = 1;
            COMMIT;
        ELSE
            SET p_result = 0;
            ROLLBACK;
        END IF;
    END IF;
END //
DELIMITER ;

方案优缺点

  • 优点:可以保证多步库存相关操作的原子性,适合扣减逻辑复杂、需要关联其他业务表操作的场景。
  • 缺点:加锁会增加事务持有时间,高并发下容易出现锁等待甚至死锁问题,性能相对原子更新方案更低。

两种方案的选择建议

如果业务场景只需要更新库存表,没有额外的关联操作,优先选择原子更新方案,性能更好;如果扣减库存的同时需要操作订单表、流水表等多个表,需要保证多表操作的原子性,再选择悲观锁方案。另外需要注意,使用悲观锁时要尽量缩小事务范围,避免长事务导致锁持有时间过长,影响整体并发性能。

SQL存储过程库存扣减原子更新悲观锁修改时间:2026-06-11 01:15:27

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。