从事支付行业的小伙伴,对幂等性这一概念肯定不陌生,首先介绍下幂等性的概念。
1、什么是幂等性?
在HTTP/1.1规范中的幂等性定义:
如果一个请求方法在服务器上多次执行的预期影响与它只执行一次相同,那么这个请求方法就被认为具有幂等性。
HTTP的幂等性指的是一次和多次请求某一个资源应该具有相同的副作用。如通过PUT接口将数据的Status置为1,无论是第一次执行还是多次执行,获取到的结果应该是相同的,即执行完成之后Status =1。
2、幂等性的应用
业务层面:
比如商品下单,支付接口,我们不可能对同一笔订单,重复支付N次,我们只能支付一次,当再次支付时,需要判断订单是否已经支付,如果已经支付,则直接返回查询结果,未支付,继续支付流程。
数据库层面:
一个订单流转状态state:0(订单创建 )--1(支付中)---2(支付成功)/3(支付失败)
当orderStatus = 1 时,其前置状态只能是0,也就是说将orderStatus由0->1 是需要幂等性的
update Order set orderStatus = 1 where OrderId = ‘orderid’ and orderStatus = 0
当orderStatus 处于0,1两种状态时,对订单执行0->1 的状态流转操作应该是具有幂等性的。 这时候需要在执行update操作之前检测orderStatus是否已经=1,如果已经=1则直接返回true即可。
但是如果此时orderStatus = 2,再进行订单状态0->1 时操作就无法成功,但是幂等性是针对同一个请求的,也就是针对同一个requestid保持幂等。
这时候再执行
update Order set orderStatus = 1 where OrderId = ‘orderid’ and orderStatus = 0
接口会返回失败,系统没有产生修改,如果再发一次,requestid是相同的,对系统同样没有产生修改
总结:幂等性指相同的条件,对同一笔订单调用同一个接口多次,结果都是一样的。