抢红包问题
来源:6-23 红包模块-过期红包业务逻辑设计讲解
![](http://img1.sycdn.imooc.com/user/54584ca90001a85802200220-100-100.jpg)
xiaoyyyyy
2020-03-16
老师如果两个用户同一时间抢红包,红包数量为1会有什么问题,如果红包数量超过1,同一时间用户抢的顺序是怎样的
写回答
1回答
-
枫荇
2020-03-18
你好同学,同一时间抢红包,一定是只有一个同学能拿到库存:
update red_envelope_goods
set remain_amount=remain_amount-CAST(? AS DECIMAL(30,6)),
remain_quantity=remain_quantity-1
where envelope_no=?
and remain_quantity>0
and remain_amount >= CAST(? AS DECIMAL(30,6))
同学,可以看一下上面的SQL中 `remain_quantity>0 ` ,只有剩余数量大于1的时候,这个语句才会执行。
也就是说,当剩余数量为1的时候,同时有2个用户抢红包时,在数据库层面不存在绝对并行,update语句会串行执行,那么就只有一个用户执行成功,失败的用户程序就会返回错误:
// - 如果更新失败,也就是返回0,表示无可用红包数量和金额,抢红包失败
if rows <= 0 || err != nil {
return errors.New("没有足够的红包和金额了")
}00
相似问题