问题描述:用户下订单购买,因为各种原因(网络卡,快速点击等)重复提交2个或者以上一模一样的订单,由于是同时提交的,第一个订单执行扣款生成订单未完成时候,第二个已经进来了,导致付一笔钱购买了2次或多次商品

常见的解决思路

  1. 前端通过控制JS来控制重复提交按钮,第一次可以提交,提交后直接变成灰色,这样看起来就解决了问题,但是并不能从根本上解决问题(刷新页面可能就会失效)!

  2. 借助中间件Redis key value 的 incry原子性性质,第一次提交的时候incry会将变量值 + 1 ,第二次提交的时候可以先判断,如果value 已经是等于1了,那么就说明已经提交过一次了,第二次那么不让它重复提交。(推荐使用)

  3. token的唯一性:用户第一次提交。服务器在session中存入一个唯一的token,并且发送给客户端。发送完毕后,服务器将session中的token值清空或者替换掉,第二次如果客户端再想提交,此时的token值肯定和服务器内部session存储的token值不一致,抛出异常提示不让它重复提交。