Java 保证接口的幂等性 防止用户网络延迟条件下的多次提交

最近刷到比较多的保证接口幂等性的文章,下面我来说说我对防止重复提交的理解及解决方法

举栗子:当网络延迟的情况下,用户多次点击,多条数据插入到数据库,或者造成数据的不一致性,如提交订单,扣钱等。

简述一下前端解决思考 :按钮只让用户点击一次;重定向至友好页面,避免多次点击,此文主要介绍我的一些Java解决的思路及方法。

乐观锁机制

  • 用户下订单,就会走保存订单的接口,此时,就根据用户的id去查它积分的version的值,如1
  • select version from payment where user_id =1  -- version = 1
  • 支付时,带着version的值去更新,版本号匹配则更新,版本号不匹配则不更新
  • update payment set version = version + 1, integral = #{integral}   where user_id = 1 and version = 1

 Token机制

  • 思路和上边的乐观机制相仿
  • 访问保存订单接口时,生成token返回前端并保存至缓存
  • 支付时,带着token去访问支付接口,若缓存中存在表明第一次提交,处理业务并删除缓存中对应的token
  • 若发生重复提交,因为缓存中的token已经不存在了,那么就不执行后续的业务处理,返回友好提示即可

 分布式锁

  • 根据用户的唯一值生成唯一的uuid,这一点跟我之前写的redis实现分布式锁相仿,就不赘述了,具体查看下方链接
  • 点我看原文

 唯一标识

  • 也是类似于我之前写的一遍博客,保证rabbitmq的消息幂等性
  • 生成唯一uuid存放之缓存中,支付时先去缓存中判断uuid是否存在,存在及重复操作,具体查看下方链接
  • 点我看原文

大家有更好的解决办法,或者我说的不准确的地方,欢迎留言 ~

猜你喜欢

转载自blog.csdn.net/weixin_44912855/article/details/115015263