最近刷到比较多的保证接口幂等性的文章,下面我来说说我对防止重复提交的理解及解决方法
举栗子:当网络延迟的情况下,用户多次点击,多条数据插入到数据库,或者造成数据的不一致性,如提交订单,扣钱等。
简述一下前端解决思考 :按钮只让用户点击一次(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)加锁
- 点我看原文