幂等性
一,幂等性概念
幂等性:一次或多次请求同一个资源,资源本身应该有相同的影响(网络超时,宕机等除外),
或者说,任意多次请求某一资源对资源本身的影响,与一次执行的产生的影响是一样的。
(这里有个隐含前提是,“一次或多次请求”指的是同一事件,而不是互为独立事件)
二,幂等性是指一次或多次请求资源,对资源的影响是相同的。
比如,第一次查询结果是三条数据,随后新增了两条,第二次查询结果是5条数据。查询结果不同,但查询请求本身对资源没有任何影响。这是幂等的!
比如,第一次更新一条数据,版本号 version = 5,第二次,更新这条数据,版本号 version = 5。之后的任意次更新数据,他的version = 5;则是幂等的。
第一次更新一条数据,版本号 version = version + 1 = 5,第二次,更新这条数据,版本号 version = version + 1 = 6。此后每次结果都 + 1。
(这里的多次操作都是同一事件,不是独立事件)
举个列子:淘宝买鞋,生成一个订单号,支付时,扣除买家账户500。由于某种原因,支付按钮出现重复提交现象。重复提交发出多次扣款请求,
这个时候,多次请求的结果与一次请求是同一事件,只需要对买家账户进行一次扣款,而不是重复提交的每次请求都扣掉买家500。
如果买家再次加购同一款鞋,生成的另一订单号,这个时候的扣款则是另外一次事件。与上一个订单是互为独立事件。
需要注意的是网络超时、服务宕机等问题,不在幂等的范围。
幂等性 是系统服务对外的一种承诺,并不是一种实现。接口提供方承诺,对于同一事件,一次调用与多次调用的影响一致。
声明为幂等的服务,调用失败是一种常态,属于正常业务,并且允许重试。
三,适用“幂等”的场景
开发过程中,经常遇到重复提交的问题。造成重复提交的原因有很多,比如,由于网络不稳定,获取不到提交结果,再次提交。或者前端按钮点击过快造成重复提交。
一般像银行的 业务,或者电商支付这些涉及到金钱交易的,都需要考虑到幂等。负责一个流水号扣了n次钱,会造成严重的生产事故。
以SQL为例,
1,查询 SELECT * FROM ORDER WHERE id = 'a2fe2a235afer456g453wg2';
无论执行多少次,查询请求都不会去对数据库有任何影响。是天然幂等的!
2,根据唯一标识更新:update order set ifPayFlag = 1 where id = ‘a2fe2a235afer456g453wg2’
无论执行多少次,ifPayFlag 都是1,符合幂等要求。
3,Update StructData set version = version+1 where id = 2
每次更新,version 都会自增1。不符合幂等要求。Update StructData set version = version+1 where id = 2 and version = 1;

浙公网安备 33010602011771号