老师,
你好!我想咨询一下扣减库存时,要是redis cluster进行主从切换的时候会不会发生超卖或者少卖的问题?
首先,我理解您代码中是使用原子性的incrby命令来完成更新和返回最新结果的动作的。我理解正常情况下即便是在cluster模式下,所有客户线程对于一个固定key的写操作都是在一个切片上的,所以原子性是不会有问题的。但是我这两天一直困惑于一些特殊情况:由于从切片从主切片上同步数据是异步的,所以如果进行秒杀活动时发生了切片的主从切换(主节点宕机),会不会造成超卖或者少卖?
假设有总库存6个,要是甲(买1个)、乙(买2个)、丙(买4个)三个人的请求甲和乙在主节点A上执行好了但是还没来得及复制到从节点B上(也就是甲和乙的扣减动作还未更新到从节点B上),这时候突然发生了主从切换,B节点升为主节点。,此时丙执行扣减动作是在B节点上的,会发现剩下库存还是6个而不是6-1-2=3个,会继续扣减库存,并且生成流水单。所以最后6个库存卖了7个。会不会出现这种超卖的现象?
另外,要是发生主从切换的时间点变为丙扣减发现库存<0并且加回了库存后,但是从节点只获取到了丙扣减库存的记录,但是没记录到丙加回库存的动作。这样会不会出现少卖?
老师,请问是不是有一定概率会出现这样的问题?要是出现的话一般是怎么处理的?
谢谢!