Java 保证接口的幂等性 接口唯一性 避免重复提交

20 篇文章 1 订阅

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

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

简述一下前端解决思考 :按钮只让用户点击一次(Loading);重定向至友好页面,避免多次点击,此文主要介绍我的一些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已经不存在了,那么就不执行后续的业务处理,返回友好提示即可

 分布式锁

  • 根据用户的id或者其某个唯一的值当锁的key, trylock(0L, lock)加锁
  • 点我看原文
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值