You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React JS预约系统:同时段同时预约时后端如何判定请求处理优先级?

同一时段预约冲突的后端优先级处理方案

当两名用户同时预订同一时段时,后端不能依赖请求的到达顺序(网络延迟可能导致后发请求先到),必须通过明确的原子性逻辑来确定优先级,以下是几种实用方案:

  • 数据库原子性校验与行锁
    这是最稳妥的方案,直接在数据库层面保证操作的唯一性:

    • 使用SELECT ... FOR UPDATE行级锁:执行预订前,先锁定目标时段对应的数据库行,检查是否已被占用,确认空闲后立即完成预订操作,最后释放锁。后续请求会因为锁等待,直到前一个操作完成后再检查,此时时段已被占用,直接返回失败。
    • 或者用原子插入语句:比如INSERT INTO bookings (slot_id, user_id) SELECT ?, ? WHERE NOT EXISTS (SELECT 1 FROM bookings WHERE slot_id = ?),只有第一个符合条件的请求能插入成功,其余会因为条件不满足返回失败。
  • 请求队列化处理
    对同一时段的并发请求做队列化,按顺序处理:

    • 后端收到预订请求后,先判断该时段是否存在处理队列,不存在则创建队列并加入当前请求;存在则直接入队。
    • 队列中的请求按入队时间顺序依次执行,每个请求执行时再做原子校验,确保只有第一个请求能成功预订,其余请求直接返回冲突提示。
  • 客户端时间戳优先级(需防篡改)
    让前端发起请求时携带毫秒级精确时间戳,后端以此作为优先级判定依据:

    • 必须对时间戳做签名校验(比如用后端下发的密钥生成签名),防止用户修改时间戳插队。
    • 后端收集同一时段的并发请求后,只处理时间戳最早的请求,其余直接返回“时段已被占用”。
  • 乐观锁机制
    给时段记录添加版本号字段,通过版本号校验来保证更新的唯一性:

    • 初始版本号为0,用户发起预订时,后端先查询该时段的当前版本号,然后执行UPDATE slots SET status = 'booked', version = version + 1 WHERE slot_id = ? AND version = ?。
    • 只有第一个执行该语句的请求会成功(版本号匹配),后续请求会因为版本号不匹配更新失败,后端返回冲突提示。

内容的提问来源于stack exchange,提问作者Chandan Sh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:45:49