防止重复提交——幂等接口的思想
防止重复提交——幂等接口的思想
网络中有发生拥堵导致反馈不及时,用户一直点击提交的情况,一直点提交,所有的表单信息都是一样的,这样就会创建出多个事务出来,如创建多个一模一样的订单,多个一模一样的用户,为了防止此类事件发生,引入一种思想“幂等”
[!note]
何为幂等?通俗来说:多次执行某操作与仅执行一次此操作的效果相同,比如注册业务,多次点击注册提交和点击一次注册提交的效果一样,数据库只会多出来一条记录
-
第一阶段
当用户进入提交页时,主动发请求到后台获取后台提供的一个UUID并将此UUID存入本地,当用户提交表单时,把此UUID封装到表单里一起提交,后台接收到请求,验证UUID是否在数据库(Redis)中存在,因为这是第一次提交,所以不存在,则往后执行业务,业务执行完成后将此UUID写入Redis,最后返回结果
-
第二阶段
这时因为网络原因,用户迟迟没有收到返回结果,于是用户又点击一次提交,后台收到请求后照例去Redis中查UUID,发现UUID已经存在了,便不再执行后续业务代码,并把“重复提交”写入返回结果中
-
第三阶段
用户收到了含有“重复提交”的返回结果,退出界面,退出界面前给后台发送一个删除UUID的请求,请求requestbody中携带UUID,后台接收到请求,并去Redis中删除这个UUID,并返回成功的response,前台收到这个response后,清除前台的UUID。
至此,幂等性接口就实现了,当然我不建议后台把UUID写入MySQL,因为UUID是一个不会长时间保留的数据,对于大流量的请求,很可能给MySQL过高压力。
我强烈建议在一些常用的接口,涉及到数据库增,删,改的业务都用到幂等性的思想,毕竟数据的正确度是极其重要的
本文来自博客园,作者:勤匠,转载请注明原文链接:https://www.cnblogs.com/JarryShu/articles/18280554

浙公网安备 33010602011771号