什么是幂等?
f(x)=f(f(x))
幂等性测试
同一个请求被执行一次与被执行多次的效果是一样的,服务器的状态也是一样的
为什么需要幂等?
接口调用在一般情况下不会重复提交,但在一些特殊情况下会出现重复提交的状况
用户重发
网络重发
系统重发
消息重发
幂等性多数场景运用在支付、订单、和分布式事务处理等
例如:
小明去华住定大床房
一间200
结果在付钱的时候因为网络不好系统提示支付失败
于是小明又付了一次钱
等付完钱后发钱钱被扣了两次!!
幂等的类型
幂等操作在底层无碍乎就是两种操作
1.插入:insert
2.更新:update
一般插入幂等多用于生成流水号
在确保流水号的唯一性的同时也要确保与上下游的数据一致性
没做幂等
如果小明的支付流水号由上游生成或使用全局流水号,就能在保证唯一性的时候发现已经存在该流水号,也就避免了重复插入的问题
幂等校验
小明
发起支付
第二次发起支付
插入上游传递的唯一流水号
第二次支付
发现流水号已存在
查询并返回支付状态阻止第二次生成流水号
更新幂等
小明想要挽回损失,对多付的订单发起退款申请
小明操作失误,同时点了2次退款申请
两次请求都成功了!
小明获得退款400
由于没有做幂等,导致小明赚了200
为何会有更新不幂等
1.未判断原始更新状态
2.事务的并发处理问题
造成什么问题?
- 1.更新丢失
- 2.脏读
- 3.幻读
- 4.不可重复读
注意
幂等性测试也是验证数据一致性的重要一环