抢红包问题

来源:6-23 红包模块-过期红包业务逻辑设计讲解

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("没有足够的红包和金额了")
}

0
0

仿微信抢红包 Golang实战多版本抢红包系统

Golang红包系统单体版+并发版+分布式+微服务版,四大金装版、超值必修课

582 学习 · 159 问题

查看课程