表单重复提交问题(接口幂等性)

  近期工作中遇到用户重复提交表单信息情况,尤其是在网络延时的情况下,用户点击提交按钮后,页面迟迟未响应,于是就会再次点击提交按钮。这样就导致产生重复数据,会对后续的业务带来一定问题。为此,查了一些资料,学习总结了下相关问题的解决思路。

  首先,重复提交的问题,专业点的说法叫做接口幂等性问题。一个接口, 多次发起同一个请求,必须保证操作只能执行一次;出现这类问题的常见业务场景有:  

**使用场景:


  1.订单接口(不能多次创建同一订单)
  2.支付接口, 重复支付同一笔订单只能扣一次钱
  3.支付宝回调接口,可能会多次回调, 必须处理重复回调
  4.普通表单提交接口,因为网络超时等原因多次点击提交, 只能成功一次等等

**常用解决方案

  1.唯一索引 -- 防止新增脏数据
  2.token机制 -- 防止页面重复提交
  3.悲观锁 -- 获取数据的时候加锁(锁表或锁行)
  4.乐观锁 -- 基于版本号version实现, 在更新数据那一刻校验数据
  5.分布式锁 -- redis(jedis、redisson)或zookeeper实现
  6.状态机制 -- 状态变更, 更新数据时判断状态

原文地址:https://www.cnblogs.com/niew/p/13429810.html