关于幂等性的学习笔记

举报
旧时光里的温柔 发表于 2022/02/12 19:56:00 2022/02/12
【摘要】 最基础的概念,什么是幂等性?幂等性:提交多次的情况下,结果都一样。比如数据库查询,可称为天然幂等性,即查询多次结果都一样,无需人为去做幂等性操作。但是update table set value=value+1 where id=1,每次执行的结构都会发生变化,不是幂等。inter into table(id,name)values(1,‘name’),如id不是主键或者没有唯一索引,重复操...

最基础的概念,什么是幂等性?
幂等性:提交多次的情况下,结果都一样。
比如数据库查询,可称为天然幂等性,即查询多次结果都一样,无需人为去做幂等性操作。
但是
update table set value=value+1 where id=1,每次执行的结构都会发生变化,不是幂等。
inter into table(id,name)values(1,‘name’),如id不是主键或者没有唯一索引,重复操作上面的业务,会插入多条数据,不具备幂等性;

所以我们在什么情景下需要确保幂等性呢?
用户多次点击保存按钮
用户保存成功后,返回上一页再次保存
微服务相互调用,由于网络原因,导致请求失败

解决方案
一、token机制:
1、根据业务场景,判断哪些业务存在幂等性问题,在执行业务之前先获取token,将token缓存止redis中
2、调用业务接口时,将token携带过去,一般放在请求头,作为Auth认证
3、服务器判断token是否存在于redis中,存在表示第一次请求,然后删除token,继续执行业务
4、如果不存在,则表示反复操作,不执行业务逻辑,直接返回重复标志!结束
风险性:业务执行前删除还是后删除token?
如果是执行后删除,在业务执行中,未删除token,用户又点了请求进来,那么则无法保障幂等性。
如果是执行前删除,在分布式下,用户快速请求2次,这时2个请求同时到redis去获取token,对比成功,同时删除,同时执行业务,那么也无法保障幂等性。
so:使用执行前删除,在分布式情况下,获取,对比,删除必须确保原子性,所以要加分布式锁。

二、加锁
1、数据库锁
select * from table where … for update
2、业务层面加分布式锁
将获取、对比、删除作为一个原子性的操作加锁,处理完成后释放锁,确保串行操作。

三、约束
数据库唯一约束:通过主键、唯一索引,确保无法重复新增同一笔数据,这就能确保幂等性

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。