后端并发问题,或者重复下单问题,可以采取:一锁二判三更新:
一锁:表示先获取锁,保证同一个时间只有一个操作能执行
二判:检查数据的状态是否符合预期,防止脏更新。
三更新:确认无误后执行更新操作。
比如:扣库存的场景:
为什么要这么做呢?
1.两个用户同时给同一个商品下单,而商品仅剩最后一件库存,如果没有加锁,可能会出现两个订单同时下单成功,但实际上库存不足的情况。
2.同样的:如果你加了锁,如果没有二判(判断库存是否充足),依然可能会出现两个订单都创建成功。
所以说:单独锁,单独判,都不行,必须都要进行,一锁二判三更新
一锁:其实有不同的实现方法比如:悲观和乐观锁
:悲观锁:适合操作比较频繁,冲突概率比较高的场景,
优点:实现简单,冲突处理直接
缺点:可能导致锁等待,并发性能低
乐观锁:读操作频繁,写冲突少的场景
很多使用的是Redis分布式锁
分布式系统中:一锁“通常升级为分布式锁”,二判:在库存场景下的核心就是判断库存是否满足需求。
浙公网安备 33010602011771号