举个例子说,我们java后台写的一个接口或者方法,调用一次和调用N次,如果从理论上
我们得到的结果是一样的,那么这个操作就是幂等的(查询,设置),而插入和删除是典型的非幂等操作,因为不可重现;
再举个例子...,
如果给的响应中间件没有收到,消息将会重复被B消费)接下来开始分析库存扣减并发问题的解决方案,解决并发问题有很多方式,比如说借助redis原生的单线程阻塞操作,
zk的节点操作,以及其他封装的分布式锁操作...2或者3,而不是我们期望的0;因为A B两个线程查询的时候stock=5,都是在此数字上扣减,
导致其中一个结果被覆盖,拿到错误的扣减结果,
还有一种情况是,设计往往有容错机制,例如“重试”,如果通过扣减接口来修改库存...,在重试时,可能会
得到错误的数据,导致重复扣减;
重试导致错误的根本原因,是因为“扣减”操作是一个非幂等的操作,不能够重复执行,改成设置操作则不会
有这个问题
解决方案
参考CAS思想,我们进行更新的时候带上期望数据库存在的旧值...and stock = oldValue,这种情况在并发场景下,
执行update的时候如果发现oldValue和之前查出来的值不一致,那么就放弃update,返回给调用方错误码(或者抛出异常);
但是这样还是存在一个问题