再次提醒我一次“幂等性”
Posted 丶何苦丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了再次提醒我一次“幂等性”相关的知识,希望对你有一定的参考价值。
什么是幂等性
提供的接口承诺幂等性 含义:
只要调用接口成功,外部对接口的多次调用得到的结果是相同的。即执行多次和一次的效果是一样的。
为什么需要幂等
用户在APP上连续点击了多次提交订单,后台应该只产生一个订单;(下多个相同的单,我有病啊)
向支付宝发起支付请求,由于网络问题或系统BUG重发,支付宝应该只扣一次钱。(多付N笔钱,我真有钱啊) 很显然,幂等接口认为,外部调用者会存在多次调用的场景,为了防止重试对数据状态的改变,需要将接口的设计为幂等的。
什么情况下需要保证幂等性
以SQL为例,有下面三种场景,只有第三种场景需要开发人员使用其他策略保证幂等性
SELECT col1 FROM tab1 WHERE col2=2,无论执行多少次都不会改变状态,是天然的幂等。
UPDATE tab1 SET col1=1 WHERE col2=2,无论执行成功多少次状态都是一致的,因此也是幂等操作。
UPDATE tab1 SET col1=col1+1 WHERE col2=2,每次执行的结果都会发生变化,这种不是幂等的。
保证幂等策略
例: 不考虑并发的情况下,实现幂等很简单
先查询一下订单是否已经支付过,
如果已经支付过,则返回支付成功;如果没有支付,进行支付流程,修改订单状态为‘已支付’。
防重复提交策略
并发下保证幂等方案分两步
第2步依赖第1步的查询结果,无法保证原子性的。
在高并发下就会出现下面的情况:
第二次请求在第一次请求第2步订单状态还没有修改为‘已支付状态’的情况下到来。既然得出了这个结论,余下的问题也就变得简单:把查询和变更状态操作加锁,将并行操作改为串行操作。
以上是关于再次提醒我一次“幂等性”的主要内容,如果未能解决你的问题,请参考以下文章