Java电商库存扣减实现

业务需求:做了一个商城系统,在下单库存扣减时存在超卖问题,决定采用乐观锁保证数据一致。

1、库存所在表添加version乐观锁字段

2、实体类字段上面使用mybatis的@Vesion注解

(这个注解会帮你判断并且自动+1,使用注解记得先查询再update,生效的前提是获取上一次的版本号,也可以自己实现。*注意:如果使用LambdaUpdateWrapper去更新,实体上的@Vesion将失效,要向我下面一样写完全条件)

3、如果乐观锁生效,触发重试机制,重试次数可以根据自己业务决定。

4、话不多说,上代码(只有核心代码块)

/**

 * 库存扣减

 *

 * @param number      执行次数,用于并发情况下重试标识

 * @param ssOrderItem sku明细信息

 */

private void stocks(SsOrderItem ssOrderItem, int number) {

    // 重试超过三次,返回失败

    if (number > 3) {

        throw new RuntimeException("购买失败,请重新查询商品!");

    }

    SsGoodsSku byId = ssGoodsSkuService.getById(ssOrderItem.getSkuId());

    if (byId.getActualStocks() - ssOrderItem.getBuyNumber() < 0) {

        throw new RuntimeException(String.format("商品库存不足【剩余%s,购买%s】!", byId.getActualStocks(), ssOrderItem.getBuyNumber()));

    }

    LambdaUpdateWrapper<SsGoodsSku> updateWrapper = new LambdaUpdateWrapper<>();

    updateWrapper.eq(SsGoodsSku::getId, ssOrderItem.getSkuId());

    updateWrapper.eq(SsGoodsSku::getVersion, byId.getVersion());

    updateWrapper.set(SsGoodsSku::getVersion, byId.getVersion() + 1);

    updateWrapper.set(SsGoodsSku::getActualStocks, byId.getActualStocks() - ssOrderItem.getBuyNumber());

    boolean update = ssGoodsSkuService.update(updateWrapper);

    if (!update) {

        stocks(ssOrderItem, number + 1);

    }

}

 此方式适用于并发量一般的业务。高并发下会有一定性能压力噢~~~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值