库存什么时候扣,是票务系统上线前必须定死的一条规则,也是最容易被临时改动的规则。扣早了,大量未付款订单占着名额;扣晚了,游客已经付了钱却没票;扣在核销那一步,当天的余量看起来永远充足。三种时机没有绝对对错,只有各自的失效方式,关键是提前知道自己愿意承担哪一种。
一、下单扣减:把名额交给占位的人。游客提交订单即扣减库存,票务系统里这条动作对应的是占用量字段,不是实际销量。它的直接后果是假性售罄:旺季高峰一小时可能出现上千条未付款订单,每条占一到三张,页面显示已满,窗口却说还有余量。所以下单扣必须配一个释放时限,未付款订单超时自动把占用量退回可用量。
释放时限怎么定,看渠道行为。小程序购票的用户多在两分钟内完成支付,超时设十分钟到十五分钟够用;分销商和旅行社代订走的是先下单后统一结算,时限要给到三十分钟以上,甚至可以按团队单独放开。定时任务一般一分钟跑一轮,扫描已过时限的待支付订单,回滚占用量并把订单置为已关闭。这一步必须做幂等,否则同一订单被两轮任务扫到,库存会凭空多出几张。

二、支付扣减:把风险留给并发。等回调到达再扣库存,报表干净,但余量判断和扣减动作之间有零点几秒的空档。同一个时段最后三张票被十几个请求同时读到还有余量,就会出现超卖。防法不是把判断挪到别处,而是让扣减本身原子化:一条更新语句带条件,影响行数为零就判失败。检票记录字段那边也要留对应关系,超卖产生的退票在闸机上表现为无效码,属于可预期现象,但不能没有兜底话术。
三、核销扣减:报表滞后是代价。把扣减推到入园那一刻,好处是承载量统计最接近真实,未入园的空位能被后面的人补上。问题在于预售阶段完全没有约束,时段满员只能靠另一个预约量字段单独控制,两套数对不上时,窗口和客服要各解释一遍,同一件事出现两种说法。景区票务系统真正合适的用法,是把它当作二级校验,而不是一级扣减点;用成一级扣减的场子,旺季当天的余量提示基本失去参考价值,游客到门口才发现进不去。

四、混合渠道时的取舍。线上散客走下单扣,窗口走支付扣,现场一手交钱一手出票,本来就不存在占位问题;分销商走额度扣而不是张数扣。三条路径要落在同一个库存池上,否则渠道之间互相看不见。做法是给每条动作写清扣减来源,票务系统的记录里保留来源、动作类型、前后余量和订单号,出问题时能一眼看出是哪条路径把量吃掉了。
五、定死之后别再改。扣减时机换成哪一种,都要跟着改超时释放、告警阈值和日结对账口径。只改扣减点不改对账,当天的销量与占用量会差出一截,等发现时多半已经在闸机排队了。
