(A像中间件发消息,如果中间件没有收到消息或者收到消息后,给的响应A没有收到,
那么A将重发消息;B消费中间件存储的消息,
如果给的响应中间件没有收到,消息将会重复被B消费)接下来开始分析库存扣减并发问题的解决方案...比如说借助redis原生的单线程阻塞操作,
zk的节点操作,以及其他封装的分布式锁操作;此处借助CAS理念和幂等使用mysql自带的表锁和行级锁实现并发操作
背景
常用的扣减操作是service层操作数据库执行...,
还有一种情况是,设计往往有容错机制,例如“重试”,如果通过扣减接口来修改库存,在重试时,可能会
得到错误的数据,导致重复扣减;
重试导致错误的根本原因,是因为“扣减”操作是一个非幂等的操作,不能够重复执行...,改成设置操作则不会
有这个问题
解决方案
参考CAS思想,我们进行更新的时候带上期望数据库存在的旧值update Stock set stock = newValue
where id = ?...,例如:当前线程
是A,查到库存是5,B线程把库存扣减到3,然后C线程又把线程新增到5,那么A执行上述更新操作的时候对这
两次变更时无法感知的,其实A持有的stock=5已经和现在两次修改
后的stock