日常开发中,我们可能会碰到需要进行防重放与操作幂等的业务,本文记录SpringBoot实现简单防重与幂等
防重放,防止数据重复提交
操作幂等性,多次执行所产生的影响均与一次执行的影响相同
解决什么问题?
表单重复提交,用户多次点击表单提交按钮
接口重复调用,接口短时间内被多次调用
思路如下:
1、前端页面表提交钮置灰不可点击+js节流防抖
2、Redis防重Token令牌
3、数据库唯一主键 + 乐观锁
具体方案pom引入依赖
一个测试表
前端页面先写一个test页面,引入jq
按钮置灰不可点击
点击提交按钮后,将提交按钮置灰不可点击,ajax响应后再恢复按钮状态
js节流、防抖
节流:给定一个时间,不管这个时间你怎么点击,点上天,这个时间内也只会执行一次
防抖:给定一个时间,不管怎么点击按钮,每点一次,都会在最后一次点击等待这个时间过后执行
Redis防重Token令牌
跳转前端表单页面时,设置一个UUID作为token,并设置在表单隐藏域
后台查询redis缓存,如果token不存在立即设置token缓存,允许表单业务正常进行;如果token缓存已经存在,拒绝表单业务
PS:token缓存要设置一个合理的过期时间
for循环测试中,5个操作只有一个执行成功!
数据库唯一主键 + 乐观锁
查询操作自带幂等性
查询没什么好说的,只要数据不变,查询条件不变的情况下查询结果必然幂等
唯一主键可解决插入操作、删除操作
利用主键唯一的特性,捕获处理重复操作
乐观锁可解决更新操作
执行更新sql语句时,where条件带上version版本号,如果执行成功,除了更新业务数据,同时更新version版本号标记当前数据已被更新
执行更新操作前,需要重新执行插入数据
以上for循环测试中,5个操作同样只有一个执行成功!
后记redis、乐观锁不要在代码先查询后if判断,这样会存在并发问题,导致数据不准确,应该把这种判断放在redis、数据库
错误示例:
错误示例:
防重与幂等暂时先记录到这,后续再进行补充
代码开源代码已经开源、托管到我的GitHub、码云:
GitHub:https://github.com/huanzi-qch/springBoot
码云:https://gitee.com/huanzi-qch/springBoot
总结到此这篇关于SpringBoot系列教程之防重放与操作幂等的文章就介绍到这了,更多相关SpringBoot防重放与操作幂等内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!