电商业务中如何防止重复下单?
用户下单流程我们从用户浏览商品开始看看用户下单的简要过程用户下单简要过程浏览商品用户查看商品详情加购/结算用户可以选择直接购买商品也可以先加入购物车用户购买的这一步就是结算确认下单结算完成就进入了下单页面提交订单这一步就会生成一个订单然后进入付款页面我们可以看到下单是发生在结算之后下单之后会生成唯一的订单号接下来客户端需要用这个订单号去完成支付。那接下来先看看为什么发生重复下单为什么会重复下单为什么会重复下单对于订单服务而言就是接到了多个下单的请求原因可能有很多最常见的是这两种用户重复提交网络原因导致的超时重试重复下单原因如何防止重复下单防止用户提交最常规的做法就是客户端点击下单之后在收到服务端响应之前按钮置灰。当然防止重复下单肯定不能只依靠客户端可能会因为一些网络的抖动导致仍然有重复的请求到达服务端所以还是要在服务端做防重/幂等的处理。PS这里额外插入一点我对防重和幂等的理解防重指的是防止重复提交幂等指的是多次请求如一次简单说就是防重可以给对重复请求抛异常幂等是对重复的请求响应第一次的结果在我们讨论的这个场景里幂等就是响应唯一的订单号。防重和幂等防重第一步需要识别请求是否重复这一步需要客户端配合实现。为什么呢大家想一下下单的时候服务端怎么去判断这个下单请求是否唯一呢金额商品优惠券……万一用户就是喜欢又下了一个一模一样的单呢所以需要客户端在请求下单接口的时候需要生成一个唯一的请求号requestId服务端拿这个请求号判断是否重复请求。那么接下来压力就给到服务端了看看服务端怎么实现防重/幂等吧利用数据库实现幂等可以在订单表t_order里添加一个字段requestId添加唯一索引唯一请求字段这样一来如果是重复的请求在落库的时候就会报错为了保证幂等性我们可以catch住这个异常根据requestId获取订单号然后向客户端响应订单号。大概的代码如下PlaceOrderResVO placeOrder(PlaceOrderReqVO reqVO) { try { //下单业务逻辑 …… //生成订单号 String oidgenerateOid(); …… //订单落库 Order order orderMapper.saveOrder(orderDO); //响应订单 resVO.setOid(order.getOid()); return resVO; } catch(UniqueKeyViolationException e) { // 发生了重复异常 // 根据请求号获取订单 Order order getOrderByRequestId(reqVO.getRequestId()); resVO.setOid(order.getOid()); return resVO; } catch (Exception e) { } }当然这里不太好的地方是拿异常来做业务判断。利用Redis防重另外一个办法就是下单请求的时候要加锁了通常我们的服务都是集群部署所以一般都是用Redis实现分布式锁。大概的逻辑就是以requestId为维度进行加锁如果获取锁失败就抛一个自定义的重复下单异常。如果获取到锁先check一下是否已经下单为了提高性能下单完成后也把下单的结果放在Redis缓存里。redis防重逻辑大概的代码如下public PlaceOrderResVO placeOrder(PlaceOrderReqVO reqVO) { //加锁 RLock orderLock redissonClient.getLock(RedisConstant.PLACE_ORDER_LOCK_KEY reqVO.getRequestId()); //获取锁失败抛出重复下单异常 if(orderLock.isExistes){ throw new OrderRepeatException(); } // 加锁 orderLock.lock(); try { //检查是否已经下单 RBucketPlaceOrderResVO orderCache redissonClient.getBucket(RedisConstant.PLACE_ORDER_LOCK_KEYreqVO.getRequestId()); if(orderCache.isExistes){ return orderCache.get(); } //下单业务逻辑 …… //落库 //订单落库 Order order orderMapper.saveOrder(orderDO); …… //缓存结果 orderCache.put(resVO); return resVO; } } catch (Exception e) { //…… } finally { orderLock.unlock(); } return resVO; }这里再说明一下为什么获取不到锁的时候要抛异常呢因为下单里面其实还有一些其它的业务流程比如锁库存、清优惠券……而此时获取到锁的请求的下单流程还没有结束下单的结果还获取不到没法完成响应也就没办法做幂等。客户端也可以根据响应的状态码进行特殊处理比如这个异常先不提示但是允许用户再次点击下单按钮来提升用户的体验。

相关新闻

英伟达SONIC开源全身追踪技术,重构人形机器人控制逻辑

英伟达SONIC开源全身追踪技术,重构人形机器人控制逻辑

摘要:本文深度解析英伟达开源的SONIC全身追踪技术,详解SONIC的核心定位与技术突破,拆解超大规模训练的优势、通用令牌空间的创新亮点,剖析其“系统1”控制器的差异化定位与行业对比,解读英伟达开源布局的战略意义&…

2026/7/6 3:40:49 阅读更多 →
奥迪联手Mimic Robotics!AI驱动汽车装配,破解工业自动化核心瓶颈

奥迪联手Mimic Robotics!AI驱动汽车装配,破解工业自动化核心瓶颈

摘要:本文详解奥迪与Mimic Robotics的战略合作伙伴关系,双方合作的核心目标与落地成果,拆解Mimic“像素到动作”技术架构的突破价值与Mimic-Video模型的优势,剖析Mimic差异化的技术路线与数据训练方式,解读苏黎世“机器…

2026/7/6 10:29:22 阅读更多 →
恐怖谷镜像:Seedance 2.0来袭,我们再也难辨机器人真假?

恐怖谷镜像:Seedance 2.0来袭,我们再也难辨机器人真假?

摘要:本文深度解析字节跳动Seedance 2.0多模态视频生成模型引发的机器人行业“真相危机”,详解Seedance 2.0“多模态导演”架构的核心优势,拆解宇树G1“步兵”、Atlas舞蹈等典型虚假视频的破绽,剖析行业信任危机背后的核心矛盾&am…

2026/5/17 6:48:06 阅读更多 →

最新新闻

Excel COUNTIF函数底层逻辑与条件统计避坑指南

Excel COUNTIF函数底层逻辑与条件统计避坑指南

1. 这不是普通计数,是Excel里最常被低估的条件统计引擎 你打开一份销售报表,想快速知道“华东区销售额超50万的客户有几个”,或者翻看学生成绩单,需要统计“数学成绩在85分以上的人数”,又或者在库存表里查“状态为‘缺…

2026/7/6 10:34:13 阅读更多 →
OpenCV 4.8 透视变换实战:4步自动校正倾斜文档,PSNR 提升 25dB

OpenCV 4.8 透视变换实战:4步自动校正倾斜文档,PSNR 提升 25dB

OpenCV 4.8 透视变换实战:4步自动校正倾斜文档,PSNR 提升 25dB当你在咖啡馆用手机拍摄一份重要合同时,是否常遇到文档边缘扭曲、文字变形的困扰?传统裁剪工具只能处理简单旋转,而透视变换技术能像魔术师般将任意角度拍…

2026/7/6 10:32:10 阅读更多 →
技术团队如何用Python和Django做公益:食品银行数字化实战指南

技术团队如何用Python和Django做公益:食品银行数字化实战指南

1. 项目概述:一场扎根社区的实体行动,远不止是“捐几箱食物”“Six Feet Up Employees to Help Indiana Food Bank”——这个标题初看像一则企业新闻稿的导语,但在我过去十年跑遍全国上百个社区服务项目、参与过三十多场食品银行实地协作后&a…

2026/7/6 10:32:10 阅读更多 →
Terraform工程化实战:模块化、状态治理与计划审计三大策略体系

Terraform工程化实战:模块化、状态治理与计划审计三大策略体系

1. 项目概述:这不是一次简单的“语法升级”,而是一场基础设施即代码的思维跃迁“Terraforming Parts Unknown”这个标题乍看像科幻小说——在未知疆域上重塑地貌。但对每天和云资源、Kubernetes集群、网络拓扑打交道的工程师来说,它精准戳中了…

2026/7/6 10:30:09 阅读更多 →
YOLO目标检测全系列教程:从v1到v13的系统学习指南

YOLO目标检测全系列教程:从v1到v13的系统学习指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 这次我们来看一套完整的 YOLO 目标检测算法教程。这套教程号称覆盖了从 YOLOv1 到 YOLOv13 的所有核心算法,内容长达 100 …

2026/7/6 10:30:08 阅读更多 →
Excel COUNT系列函数:数据质量诊断与业务逻辑翻译指南

Excel COUNT系列函数:数据质量诊断与业务逻辑翻译指南

1. 项目概述:Excel中COUNT系列函数不是“数数”那么简单,而是数据质量的守门员 在Excel里写个COUNT(A1:A100),看起来只是统计非空单元格个数——但如果你真这么想,说明你还没摸到Excel数据处理的门槛。我带过二十多个企业数据分析…

2026/7/6 10:28:04 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻