当前位置: 首页 > news >正文

【场景题】如何防止重复下单

【场景题】如何防止重复下单

  • 1. 如何防止重复下单
  • 2. ✅ 方案一:数据库唯一索引
  • 3. ✅ 方案二:前端防抖(只是辅助)
  • 4. ✅ 方案三:Token 防重复提交(常见)
  • 4. ✅ 方案四:订单状态机控制(核心)
  • 5. ✅ 方案五:分布式锁(高并发场景)
  • 6. 真正生产级推荐组合方案
  • 7. 不同业务推荐方案

1. 如何防止重复下单


当网络出现了阻塞用户不断点击下单按钮,出现了重复下单,应该如何去防止呢?
普通的下单流程,首先会由用户发起一个下单操作,然后会由订单服务去保存一条订单信息,此时订单的状态是【未支付】,然后再由用户去确认订单。由支付服务把当前这条订单修改为【待支付】,然后再跳转到支付界面,接着由用户去选择对应的支付方式,来进行钱包支付。支付完成之后呢,由支付平台进行回调,回调到支付服务,再去调用订单服务,修改状态为【已支付】。

哪一步会出现重复操作,而出现幂等性操作呢?
只有在用户下单的哪一步会出现这个问题!

2. ✅ 方案一:数据库唯一索引

适用场景:同一个用户 + 同一个业务条件 只能有一个订单

例如:

UNIQUEKEYuk_user_product(user_id,product_id,biz_type)或者:UNIQUEKEYuk_order_no(order_no)

Java 代码:

try{orderMapper.insert(order);}catch(DuplicateKeyExceptione){// 已存在订单,直接查询返回returnorderMapper.selectByBizKey(...);}

✅ 优点:

  • 简单
  • 绝对可靠
  • 不怕并发

❗注意:
一定要以数据库为最终裁决者。

3. ✅ 方案二:前端防抖(只是辅助)

  • 提交后按钮 disabled
  • loading
  • 防抖 1~2 秒

但这只是体验优化,不是安全方案。

4. ✅ 方案三:Token 防重复提交(常见)

流程:

  1. 用户进入下单页
  2. 服务端生成一个 UUID token
  3. 存 Redis(有效期 5 分钟)
  4. 下单时必须携带该 token
  5. 使用 Lua 脚本原子校验并删除

Redis Lua:

ifredis.call('get',KEYS[1])==ARGV[1]thenreturnredis.call('del',KEYS[1])elsereturn0end

Java 逻辑:

  • 如果返回 1 → 允许下单
  • 如果返回 0 → 重复请求

✅ 优点:

  • 抗前端重复点击
  • 抗接口重试

❗缺点:

  • 不能防止真正的并发写库冲突
  • 还是要配合数据库唯一索引

==============================================
优雅的使用Redission来解决问题

  1. 先说清楚:Token 防重复提交在干嘛?
    同一个页面,在短时间内,用户重复点“提交”按钮。
    流程本质是:
① 页面加载 → 后端生成一个 token ② token 存 Redis(设置过期时间) ③ 用户提交时必须带这个 token ④ 后端校验 token 是否存在 ⑤ 校验成功 → 删除 token → 继续执行 ⑥ 再次提交 → token 不存在 → 拒绝

核心点:token 必须“校验 + 删除”原子执行 否则会并发通过。

  1. 标准 Redisson 实现

第一步:生成 token

@GetMapping("/order/token")publicStringgenerateToken(){Stringtoken=UUID.randomUUID().toString();RBucket<String>bucket=redissonClient.getBucket("order:token:"+token);bucket.set("1",5,TimeUnit.MINUTES);returntoken;}

第二步:下单时校验 token
⚠️ 关键点:必须原子删除
Redisson 有一个非常好用的方法:

// 这是原子的!!!bucket.getAndDelete()

最终代码

@PostMapping("/order")publicStringcreateOrder(@RequestParamStringtoken){RBucket<String>bucket=redissonClient.getBucket("order:token:"+token);Stringvalue=bucket.getAndDelete();// 原子操作if(value==null){thrownewRuntimeException("请勿重复提交");}// 执行业务逻辑return"下单成功";}

为什么 getAndDelete 是安全的?

Redis内部执行: GET key DEL key 但在Redisson中是用Lua保证原子执行的。 所以: 第一次请求 → 拿到值 → 删除成功 第二次请求 → key 已不存在 → 返回null不会出现并发穿透。

4. ✅ 方案四:订单状态机控制(核心)

订单必须有明确状态:

INIT → PAYING → PAID → CANCELLED

创建订单前:

select*from order where user_id=?and product_id=?and status in('INIT','PAYING')

存在则直接返回已有订单。这是业务级幂等。

5. ✅ 方案五:分布式锁(高并发场景)

RLocklock=redisson.getLock("order:"+userId);lock.lock();try{// 查询是否已有订单// 创建订单}finally{lock.unlock();}

适用场景:

  • 秒杀
  • 抢购
  • 打车平台
  • 库存扣减
    ❗但要注意锁粒度(不要锁全局)

6. 真正生产级推荐组合方案

前端防抖(置灰) + Token 防重复 + 数据库唯一索引 + 订单状态机控制

7. 不同业务推荐方案

场景推荐方案
普通下单唯一索引 + 状态机
秒杀Redis + Lua + 唯一索引
支付回调幂等号 + 唯一索引
打车平台用户锁 + 状态机
MQ 消费幂等表记录 message_id
http://www.jsqmd.com/news/415903/

相关文章:

  • 2026驻马店全铝橱柜实力厂家盘点:6家顶尖厂商深度解析 - 2026年企业推荐榜
  • 马斯克重奖100万美元、1.7亿的阅读量的最佳万字长文长什么样!
  • 写代码能不能干一辈子,要不要提前为35+危机布局?
  • 2026年评价高的工业废水处理设备公司推荐:污水处理一体化设备/环保污水处理设备/玻璃钢环保型化粪池/选择指南 - 优质品牌商家
  • 2026年废水处理设备厂家厂家推荐:反渗透纯水处理设备/地埋式污水处理设备/定制化粪池/定制水处理设备/选择指南 - 优质品牌商家
  • 拒绝 Rust 的复杂,跨越 Go 的极简:Zig 会是系统级编程的最终答案吗?
  • 销量遮羞布再被撕,某电车企业不顾经销商死活,销量有四成成经销商库存,顾头不顾腚!
  • 水下航行器多目标协同规划研究(Matlab代码实现)
  • TAC复现:在不确定性条件下对安全关键型多智能体系统的连续控制的二次规划方法研究(Matlab代码实现)
  • 【硬核方案】让 Windows 跑出微秒级实时性:揭秘 acontis 实时系统架构方案
  • 大冰箱大电视玩不转电车了,开始吹电车干掉酒店,这牛皮有点大喔!
  • 固定翼无人机指数预定义时间轨迹跟踪控制 固定时间干扰观测器研究(Matlab代码实现)
  • 2026年驻马店全铝蜂窝板专业厂家综合实力解析 - 2026年企业推荐榜
  • 2024年航空航天领域TASE顶刊复现-基于固定时间扰动观测器的面向输入饱和与未知扰动的固定翼无人机指数预定义时间跟踪控制研究(Simulink仿真、Matlab代码实现)
  • 2026年工业污水处理设备公司权威推荐:三级化粪池、反渗透纯水处理设备、地埋式污水处理设备、定制化粪池选择指南 - 优质品牌商家
  • 2026年驻马店全铝阳台柜厂商综合实力评估报告 - 2026年企业推荐榜
  • (混合调制)基于变频控制+移相控制+副边同步整流CLLLC 谐振隔离型直流变换器(本模型仅正向工作)
  • 【期刊复现】不完全信息Epsilon纳什均衡航天器末端追逃博弈策略(基于EKF的参数估计与自适应博弈)(Matlab代码实现)
  • 基于模糊逻辑的平行泊车运动控制、倒车入库控制研究(Matlab代码实现)
  • 2026年粪污处理设备厂家最新推荐:废水处理设备厂家、污水处理一体化设备、环保污水处理设备、玻璃钢环保型化粪池选择指南 - 优质品牌商家
  • AI元人文:无痕之根与多元共筑——智能时代意义行为原生论的哲学奠基与文明重构
  • 2026年评价高的反渗透纯水处理设备公司推荐:混凝土化粪池/环保污水处理设备/玻璃钢环保型化粪池/三格式化粪池/选择指南 - 优质品牌商家
  • 2026年环保污水处理设备厂家最新推荐:混凝土化粪池/玻璃钢环保型化粪池/一体化污水处理设备/三格式化粪池/选择指南 - 优质品牌商家
  • Day28—反射动态代理
  • 2026年地埋式污水处理设备厂家权威推荐榜:农村厕所化粪池、定制化粪池、定制水处理设备、家用小化粪池选择指南 - 优质品牌商家
  • 近期在准备面试的兄弟们注意了。。
  • 2026年评价高的定制水处理设备公司推荐:农村厕所化粪池/定制化粪池/家用小化粪池/工业废水处理设备/选择指南 - 优质品牌商家
  • SolarWinds Serv-U 多个严重漏洞可用于提供服务器root权限
  • 2026年评价高的水处理设备公司推荐:污水处理一体化设备/混凝土化粪池/玻璃钢环保型化粪池/粪污处理设备/选择指南 - 优质品牌商家
  • 合肥实力编织地毯厂家评测:如何找到兼具艺术与品质的源头? - 2026年企业推荐榜