当前位置:网站首页>如何防止重复下单?
如何防止重复下单?
2022-08-04 15:29:00 【InfoQ】
用户下单流程

- 浏览商品:用户查看商品详情
- 加购/结算:用户可以选择直接购买商品,也可以先加入购物车,用户购买的这一步就是结算
- 确认下单:结算完成,就进入了下单页面,
提交订单,这一步就会生成一个订单,然后进入付款页面
为什么会重复下单
- 用户重复提交
- 网络原因导致的超时重试

如何防止重复下单

requestId利用数据库实现幂等
t_orderrequestId
PlaceOrderResVO placeOrder(PlaceOrderReqVO reqVO) {
try {
//下单业务逻辑
……
//生成订单号
String oid=generateOid();
……
//订单落库
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防重
- 就是以
requestId为维度,进行加锁,如果获取锁失败,就抛一个自定义的重复下单异常。
- 如果获取到锁,先check一下,是否已经下单,为了提高性能,下单完成后,也把下单的结果放在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 {
//检查是否已经下单
RBucket<PlaceOrderResVO> orderCache = redissonClient.getBucket(RedisConstant.PLACE_ORDER_LOCK_KEY+reqVO.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;
}
- 为什么获取不到锁的时候要抛异常呢?
边栏推荐
猜你喜欢

明明加了唯一索引,为什么还是产生重复数据?

【云原生 | 从零开始学Kubernetes】kubernetes之StatefulSet详解

IP第十五天笔记

直播系统开发——直播间架构的设计及难点分析

使用百度EasyDL实现森林火灾预警识别

浅谈一下跨端技术方案

基于 Next.js实现在线Excel

remote: Check Access Error, please check your access right or username and password!fatal: Authenti

《2022 年上半年全球独角兽企业发展研究报告》发布——DEMO WORLD世界创新峰会圆满落幕

解决dataset.mnist无法加载进去的情况
随机推荐
C# TextBlock 上标
IP第十七天笔记
Codeforces Round #811 A~F
Li Mu's deep learning notes are here!
《电磁兼容防护EMC》学习笔记
宣传海报
使用百度EasyDL实现森林火灾预警识别
uni-app之renderjs
浅谈一下跨端技术方案
Game network UDP + FEC + KCP
Semaphore 基本原理
Nuget 通过 dotnet 命令行发布
##ansible自动化运维架构与简介
uni-app 从零开始-生命周期(二)
Next -21- 添加相册系列 - 1- 框架设置
Redis 高可用
Jupyter常用操作总结(强烈建议收藏,持续更新实用操作)
Online Excel based on Next.js
Leetcode: 215 disorderly to find the first big k element in the array
leetcode: 251. Expanding 2D Vectors