700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 大厂面试题 高并发库存扣减超卖问题解决 多种sql 适合场景

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

时间:2022-11-02 22:46:58

相关推荐

大厂面试题 高并发库存扣减超卖问题解决 多种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只能做递增。

场景:商品秒杀、优惠券⽅法,需要记录库存操作前后的业务

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。