大厂面试题,高并发库存扣减超卖问题解决,多种sql 适合场景

⾼并发库存扣减超卖问题,很多⼈加了乐观锁版本号去解决,那下⾯三种有什么区别,分别适合哪些场景使用
1)update product set stock=stock-1 where id =1 and stock>0
2)update product set stock=stock-1 where stock=#{原先查询的库存} and id = 1 and stock>0
3)update product set stock=stock-1,versioin =version+1 where id = 1 and stock>0 and version=#{原先查询的版本号}

前置知识:
什么是ABA问题:例如,有个用户同时进入领卷接口,A,B,C进入时库存还有10张,A领取后应该只有9张,但B给库存增加了一张,这样库存就还有10张,此时虽然库存是发生了变化的,但是C仍然领取成功了,这就是一个ABA问题。

答案 : 核⼼是解决超卖的问题,就是防⽌库存为负数

⽅案⼀:id是主键索引的前提下,如果每次只是减少1个库存,则可以采⽤上⾯的⽅式,只做数据安全校验,可以有效减库存,性能更⾼,避免⼤量⽆⽤sql,只要有库存就也可以操作成功,如果该sql语句中不加入条件stock>0的条件,则在高并发下就会产生库存扣减超卖,即库存将变成负数.
适用场景:⾼并发场景下的取号器,优惠券发放扣减库存等

⽅案⼆:使⽤业务⾃身的条件做为乐观锁,但是存在ABA问题,对⽐⽅案三的好处是不⽤增加version版本字段。
场景如果只是扣减库存且不在意ABA问题时,则可以采⽤上面的⽅式,但业务性能相对⽅案⼀就差了点,因为库存变动后sql就会无效。

⽅案三:增加版本号主要是为了解决ABA问题,数据读取后,更新前数据被别⼈篡改过,version只能做递增。
场景:商品秒杀、优惠券⽅法,需要记录库存操作前后的业务

三个⽅案各有利弊,看业务场景而定。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

工藤学编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值