高并发情况下解决单用户超领优惠券问题

问题抛出

在近期的项目里面有一个功能是领取优惠券的功能,

问题描述:

每一个优惠券一共发行多少张,每个用户可以领取多少张:

如:A优惠券一共发行120张,每一个用户可以领取140张,当一个用户领取优惠券成功的时候,把领取的记录写入到另外一个表中(这张表我们暂且称为表B)

<!--减优惠券库存的SQL-->
<update id="reduceStock">
     update coupon set stock = stock - 1 where id = #{coupon_id}
</update>

上面的代码按照我们的逻辑是没有问题,我通过使用PostMan软件测试也是没有问题,但是上面的代码确实是有问题的。

**往往我们写的一些业务功能,在低并发的时候很多的问题会体现不出来。**所以这个领取优惠券的功能我通过Jmeter软件来进行压测。

这里配置了一下,大概会发送500次请求,那来验证下优惠券会不会出现超发的问题

执行结果,里面没有出现异常什么的,样本为500。包括在汇总报告里面也出现了一些返回信息是 优惠券不足的信息 ,那来看下数据库里面的优惠券的总发行数量有没有变成负数呢?也就是有没有超发。

在测试的时候是测试的 id为19 的这条数据,测试完之后这里的总发行数量(stock)居然变成了-1(也就是超发了一张)。

问题引发

在解决这个问题之前,先来看下这个问题是如何引发出来的。

上面这张图是整个领取优惠券的流程(上图并没有使用流程图来画,我觉的这样画可能表达更清楚一些),在蓝色的框那里就是出现超扣减库存的时候。为啥这样说呢?

如果同时来了两个线程(你可以理解成是两个请求),比如先来的那个请求通过了检查(线程A)&#

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值