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

SpringBoot 接口幂等性设计——防重复提交终极方案

幂等性是指同一操作多次执行和一次执行的结果相同。支付、下单、转账等接口必须保证幂等性,否则用户多次点击就会产生多笔订单。

一、什么是幂等

非幂等:每次执行都会改变状态 请求1:扣款100元 → 余额900 请求2:扣款100元 → 余额800 ❌(重复扣款) 幂等:多次执行结果与一次相同 请求1:取消订单 → 订单已取消 请求2:取消订单 → 订单已取消 ✅(状态不变)

二、实现方案

1. 数据库唯一索引

// 订单表增加 order_no 唯一索引// 重复插入时数据库报错,捕获后返回"订单已存在"@TransactionalpublicOrdercreateOrder(OrderDTOdto){Orderorder=newOrder();order.setOrderNo(OrderNoGenerator.generate());// ...try{orderMapper.insert(order);returnorder;}catch(DuplicateKeyExceptione){thrownewBusinessException(400,"订单已存在,请勿重复提交");}}

2. Token + Redis(推荐)

@RestController@RequestMapping("/api")publicclassIdempotentController{@AutowiredprivateStringRedisTemplateredisTemplate;@GetMapping("/token")publicResultVO<String>getToken(){Stringtoken=IdUtil.simpleUUID();redisTemplate.opsForValue().set("idempotent:"+token,"1",30,TimeUnit.MINUTES);returnResultVO.success(token);}@PostMapping("/order")publicResultVO<?>createOrder(@RequestBodyOrderDTOdto,@RequestHeader("idempotent-token")Stringtoken){// 删除 Token,删除成功说明是首次请求Booleandeleted=redisTemplate.delete("idempotent:"+token);if(Boolean.FALSE.equals(deleted)){returnResultVO.error(400,"请勿重复提交");}// 业务逻辑...returnResultVO.success("下单成功");}}

前端流程:

1. 进入下单页 → 请求 /api/token 获取 Token 2. 提交订单 → header 携带 Token 3. 服务端校验 Token 是否存在,存在则删除并执行业务 4. 重复提交 → Token 已不存在 → 拒绝

💡 觉得有用的话,点赞 + 关注【张老师技术栈】吧!每周更新 Java/Python/爬虫 实战干货,不让你白来。

http://www.jsqmd.com/news/1151181/

相关文章:

  • 线段树 Beats 技巧在复杂区间问题中的实战解读
  • 工业声音异常检测:Log-Mel Spectrogram 与 MFCC 特征选型指南
  • 烽火连三月,API贵如油——中东动荡下的AI成本突变实录
  • OpenCV 4.8 鱼眼相机去畸变实战:Kannala-Brandt vs Mei 模型 3 种代码实现对比
  • 扇入型 vs 扇出型 WLP:3大维度对比与5大应用场景选型指南
  • 围绕MonetaMarkets提醒机制看,表现如何?
  • 2026年儿童时间管理App推荐:这3家口碑最佳
  • Kafka C++ SDK 超详细实战教程|快速入门、高阶特性、生产最佳实践、场景选型
  • 对抗攻击实操入门(一):从零搭建环境并复现 FGSM 与 PGD 攻击(超详细)
  • 抖店一件代发需要补发怎么办供应商少发漏发怎么和买家沟通
  • 安装nvm
  • Any-ttach:面向灵巧操作的工具中心型快换框架
  • OPD:基于等差数列例子解释 OPSD 的 Loss 是如何计算的
  • CUDA Kernel 调优实战:从 Naive 矩阵乘法到 Tensor Core 加速的 18 倍提升
  • 图神经网络前处理——高效邻接压缩与采样结构设计
  • HarmonyKit | 鸿蒙新特性实践:10 个工具的错误处理统一策略
  • Codex和Claude Code哪个好?2026年AI编程工具对比与选型建议
  • 三相逆变器零序电压注入 PWM 调制:从 SVPWM 到 5 段发波的 3 种实现方案对比
  • 推荐太原多色美缝胶
  • SFT数据质量评估:3种自动化方法筛选千条指令数据,PPL降低20%
  • 数据库高并发与优化原理 之 【MySQL 索引底层 B+ 树的演进与设计】
  • SCF Dialect
  • 查重总红、AI 检测超标?选对论文 AI 写作工具,一次性解决两大难题
  • 【无标题】单校多校通用|十克助教教培管理系统,零基础校长也能管好校区
  • 【AI技术教程】5分钟用Python+FAISS搭建本地RAG知识库,无需云服务
  • GEO服务商评估标准详解:技术体系、SOP流程与多平台覆盖能力横评
  • OpenDesign DataStat多项目支持架构:一站式管理openEuler、openGauss等开源社区数据
  • CIFAR-100 数据增强实战:5种策略组合提升ResNet-18精度3.5%
  • 基于STM32单片机电子项圈 宠物防丢定位 电子围栏/栏栅物联网31(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • 4D毫米波雷达 MIMO技术解析:从12到2304通道,角分辨率提升3倍的关键