并发库存或额度扣减问题

数据库

并发还达不到秒杀级别的情况下可以直接使用数据库扣减,商业版阿里云MYSQL的性能事实上也不是不能看。
案例:分润系统资方额度扣减

update company set avail_amount = avail_amount - #{amount} where avail_amount - #{amount} >= 0 where id = #{id}

不管MYSQL隔离级别是读已提交或者可重复读,上述语句都能保证并发情况下不会出现额度超扣问题。
额度扣减是采用下单预扣模式,如果后续流程失败再恢复额度。同一资方update语句基本上每分钟峰值最多也就几百次,数据库没有压力。

REDIS

秒杀场景:
预先将数据库的库存同步到REDIS
下单先get库存判断是否>=0,>=0调用DECRBY,判断返回的剩余库存>=0则表示下单成功,否则恢复库存(或者反过来用INCRBY)
利用定时等手段同步REDIS数据到数据库

并发不是特别高的应该利用CAS也是可以的

你可能感兴趣的:(并发库存或额度扣减问题)