名额超发不是系统故障,多数时候是设计漏了口子。
最典型的一幕:活动限一百人,开放报名十分钟后名额满了,可现场签到却来了一百零三。多出来的三个人,每一个都要现场临时找椅子。
三个真实原因
- 并发提交。最后几个名额同时被十个人提交,系统先查余量再写入,十个请求都查到了有余额,于是全部写入成功。
- 人工改单。运营在后台手动通过了几个待审核的报名,没注意名额已经满了。
- 一单多人。按报名条数算名额,一条报名带三个人,实际到场翻倍。
第一种是技术问题,后两种是流程问题,但后果一样。
技术层怎么防
关键是把查余量和扣名额合成一个原子操作,不要先查后写。数据库层面一条语句就能做到:
UPDATE activity SET left_num = left_num - 1 WHERE id = 12 AND left_num > 0;受影响行数为零,就说明没抢到,直接返回名额已满。这一条能挡住绝大多数并发超发。
流程层怎么防
后台手动加人时,系统要校验余量,满了就拦,而不是弹个提示让人自己判断。一单多人的活动,名额按总人数扣,不按条数扣。
再加一道保险:报名成功后发确认通知,里面写明场次和人数,用户自己会发现重复提交。
嘉云优品(JYUM)的名额扣减在提交环节完成,支持超员拦截和一单多人按人数计名额,名额这件事,任何一环松一点,现场就要多搬十把椅子。