高并发下出现超卖问题

高并发下出现超卖问题

我在做秒杀项目过程中对超卖问题的一些总结

1、增加库存表判断
并发情况下,库存判断与减库存的过程有线程安全问题,所以在最终进行减库存的时候,要多增加一个判断机制,判断当前库存是否小于0,因为Update操作会有行锁,所以可却确保线程安全,这样就可以防止库存出现负数情况。

2、订单表设置联合唯一键
防止了库存为负数的情况,还需要防止一个用户重复秒杀商品的情况,可能用户同时发出多个请求秒杀商品,在并发情况下可能出现重复秒杀,所以在订单表中增加一个用户ID和商品ID组合的唯一键。

ps:刚开始我以为这样就可以万无一失了,后来在测试过程中总是出现这样的情况:库存表没有出现负数情况,可是订单表中订单数量总是超过原先设定的库存数量,刚开始很让我费解,后来思考后发现应该是事务相关的问题,就对事务细节进行了修改,完美解决问题。

3、事务细节
减库存和增加订单这两个操作需要放在同一个事务中,
不过在并发情况下,我发现在进行在没有库存的情况下,减库存操作没有执行了,但是仍然会运行增加明细操作的代码,没有在减库存失败后就终止了事务,所以我多加了一个判断机制,来判断是否进行了减库存操作,减库存成功后才进行下订单。

  • 代码展示
@Service
public class MiaoshaService {
	
	@Autowired
	GoodsService goodsService;
	
	@Autowired
	OrderService orderService;

	@Transactional
	public OrderInfo miaosha(MiaoshaUser user, GoodsVo goods) {
		//减库存 下订单 写入秒杀订单、
		int reduceCount = goodsService.reduceStock(goods);
		if(reduceCount<=0)//可能没有减库存,判断是否真的减库存了
			return null;
		return orderService.createOrder(user, goods);
	}
	
}

总结
@Transactional只有在抛出异常时才会进行回滚,减库存操作没有抛出异常,但是却并没有真的减少了库存,所以要多加一个判断,不要天真的以为加了个事务注解就万事大吉了,同时这个问题也让我懂得了测试的重要性。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值