java redis订单减库存6_Redis+RocketMQ实现并发条件下库存的扣减/增加(秒杀库存控制)...

前言

前面我的博客介绍了有关分布式锁,分布式事务相关的问题以及解决方案,但是还是不能解决并发下单,扣减的问题,并发的时候由于数据库的隔离级别/乐观锁/悲观锁...总是会出现一些问题。最近集成了一套方案解决此类型问题,并可以适用于一般情况的秒杀方案。欢迎拍砖...

情景分析

前提条件:

商品 P 库存数量为 100

用户A,用户B 同时分别想买P,并且A,B分别买一个

数据库有版本号控制乐观锁

期望结果:

用户A,B都买到商品P,并且商品P的库存变为98

分析:

1.以前碰到这类问题的时候,我们说,可以添加分布式锁(也就是悲观锁),将商品P的id锁住,然后A,B提交订

单的时候分别预扣商品P的库存就好了(如方案一)。

2.是的,1分析的有道理,我们的核心思路确实要将并行控制为串行,但是事与愿违。我们仔细想一想:

如果,A,B想买的不仅仅P一个商品,而是P,Q两个商品呢?我们该怎么锁?一次性将P,Q都锁住?显然不是

很现实,并且实际上提交订单的时候都是从购物车下单,一个购物车里包括多个商品去下单也是很常见的,

并且还有如下逻辑大家仔细思考:

用户A下单->用户A读到库存为100

用户A预扣库存,判断剩余库存是否>=0,100-1=99>0,则A预扣

用户A的下单流程....

此时A的事务没有提交,B下单了:

用户B下单->用户B读到库存为

你可能感兴趣的:(java,redis订单减库存6)