springboot 结合mysql、redis+lua 实现库存扣减方案,防止超卖

springboot 结合mysql、redis+lua 实现库存扣减方案,防止超卖

表结构

库存表:
在这里插入图片描述
订单表:
在这里插入图片描述

方案1:采用mysql 自带行级锁

select * from t_stock for update;
当前事务提交之后,其他线程才能获取锁。判断库存是否大于或等于当前需要购买的数量,否则返回库存不足。
    @Transactional
    @Override
    public int createOrderForUpdate(Integer productId, Integer count) {
   
   
        Stock stock = stockMapper.selectForUpdate(productId);
        if (stock.getStock() < count) {
   
   
            throw new StockLackException("库存不足");
        }
        Order order = new Order();
        order.setUserId((int) Thread.currentThread().getId());
        order.setProductId(productId);
        order.setCount(count);
        order.setOrderTime(new Date());
        // 创建订单
        baseMapper.insert(order);
        // 扣减库存
        stockMapper.stockForUpdate(stock.getId(), count);
        return 1;
    }

方案2:基于版本号的乐观锁

update t_stock set stock = stock - #{count}, version = version + 1
where version = #{version} and stock >= #{count} and id = #{id}
返回结果为此次更新影响的行数,如果影响的行数大于0,表示此次更新库存充足,否则返回库存不足。
    @Transactional
    @Override
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ambition_test

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值