如何防止重复提交订单

重复提交原因

原因两种:

  • 一种是由于用户在短时间内多次点击下单按钮,或浏览器刷新按钮导致。
  • 另一种则是由于Nginx或类似于SpringCloud Gateway的网关层,进行超时重试造成的。

方案一:提交订单按钮置灰

这种解决方案在注册登录的场景下比较常见,当我们点击”发送验证码“按钮的时候,会进行手机短信验证码发送,且按钮就会有一分钟左右的置灰。

它可以在高并发场景下,从浏览器端去拦住一部分请求,减少后端服务器的处理压力。

但这种方案只能解决多次点击下单按钮的问题,对于Nginx或类似于SpringCloud Gateway的超时重试所导致的问题是无能为力的。

方案二:预生成全局唯一订单号

(1)后端新增一个接口,用于预生成一个“全局唯一订单号”,如:UUID 或 NanoID。

(2)进入创建订单页面时,前端请求该接口,获取该订单号。

(3)在提交订单时,请求参数里要带上这个预生成的“全局唯一订单号”,利用数据库的唯一索引特性,在插入订单记录时,如果该“全局唯一的订单号”重复,记录会插入失败。

备注:该“全局唯一订单号”不能代替数据库主键,在未分库分表场景下,主键还是用数据库自增ID比较好。

方案复杂,前后端都有开发工作量,还要新增接口,新增字段

方案三:前端生成全局唯一订单号(与方案二类似)

方案四:从订单业务的本质入手

“如何防止重复提交订单”,其实就是防止在短时间内,用户和商品进行多次连接

可以用 ”用户ID + 分隔符 + 商品ID“ 作为唯一标识,让持有相同标识的请求在短时间内不能重复下单,用redis。

SET key value NX EX seconds

把”用户ID + 分隔符 + 商品ID“作为Redis key,并把”短时间所对应的秒数“设置为seconds,让它过期自动删除。

(1)在提交订单时,我们可以把”用户ID + 分隔符 + 商品ID“作为Redis key,并设置过期时间,让它可以到期自动删除。

(2)若Redis命令执行成功,则可以继续走下单的业务逻辑,执行不成功,直接返回给前端”下单失败“就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值