最近刷到比较多的保证接口幂等性的文章,下面我来说说我对防止重复提交的理解及解决方法
举栗子:当网络延迟的情况下,用户多次点击,多条数据插入到数据库,或者造成数据的不一致性,如提交订单,扣钱等。
简述一下前端解决思考 :按钮只让用户点击一次;重定向至友好页面,避免多次点击,此文主要介绍我的一些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是否存在,存在及重复操作,具体查看下方链接
- 点我看原文
大家有更好的解决办法,或者我说的不准确的地方,欢迎留言 ~