大厂面试热身赛-天猫超市-二面面试题-P7技术专家岗

DBC 1.6K 0

大厂面试题,高并发库存扣减超卖问题解决,多种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=#{原先查询的版本号} 
答案 : 核心是解决超卖的问题,就是防止库存为负数
温馨提示

方案一:id是主键索引的前提下,如果每次只是减少1个库存,则可以采用上面的方式,只做数据安全
校验,可以有效减库存,性能更高,避免大量无用sql,只要有库存就也可以操作成功.
场景:高并发场景下的取号器,优惠券发放扣减库存等


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


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


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

发表评论 取消回复
表情 图片 链接 代码

分享