表单重复提交问题(接口幂等性)
近期工作中遇到用户重复提交表单信息情况,尤其是在网络延时的情况下,用户点击提交按钮后,页面迟迟未响应,于是就会再次点击提交按钮。这样就导致产生重复数据,会对后续的业务带来一定问题。为此,查了一些资料,学习总结了下相关问题的解决思路。
首先,重复提交的问题,专业点的说法叫做接口幂等性问题。一个接口, 多次发起同一个请求,必须保证操作只能执行一次;出现这类问题的常见业务场景有:
**使用场景:
1.订单接口(不能多次创建同一订单)
2.支付接口, 重复支付同一笔订单只能扣一次钱
3.支付宝回调接口,可能会多次回调, 必须处理重复回调
4.普通表单提交接口,因为网络超时等原因多次点击提交, 只能成功一次等等
**常用解决方案
1.唯一索引 -- 防止新增脏数据
2.token机制 -- 防止页面重复提交
3.悲观锁 -- 获取数据的时候加锁(锁表或锁行)
4.乐观锁 -- 基于版本号version实现, 在更新数据那一刻校验数据
5.分布式锁 -- redis(jedis、redisson)或zookeeper实现
6.状态机制 -- 状态变更, 更新数据时判断状态