并发库存或额度扣减问题
2020-01-15 本文已影响0人
晚歌歌
数据库
并发还达不到秒杀级别的情况下可以直接使用数据库扣减,商业版阿里云MYSQL的性能事实上也不是不能看。
案例:分润系统资方额度扣减
update company set avail_amount = avail_amount - #{amount} where avail_amount - #{amount} >= 0 where id = #{id}
不管MYSQL隔离级别是读已提交或者可重复读,上述语句都能保证并发情况下不会出现额度超扣问题。
额度扣减是采用下单预扣模式,如果后续流程失败再恢复额度。同一资方update语句基本上每分钟峰值最多也就几百次,数据库没有压力。
REDIS
秒杀场景:
预先将数据库的库存同步到REDIS
DECRBY,判断返回的剩余库存>=0则表示下单成功,否则下单失败
利用定时等手段同步REDIS数据到数据库
并发不是特别高的应该利用CAS也是可以的