博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django drf:幂等性
阅读量:5035 次
发布时间:2019-06-12

本文共 928 字,大约阅读时间需要 3 分钟。

一、什么叫做幂等性

  

用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。举个最简单的例子,那就是支付,用户购买商品使用约支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条...

 

在以前的单应用系统中,我们只需要把数据操作放入事务中即可,发生错误立即回滚,但是再响应客户端的时候也有可能出现网络中断或者异常等等。

 

二、post添加数据不具有幂等性

 

在增删改查4个操作中,尤为注意就是增加或者修改,

查询对于结果是不会有改变的,(get)

删除只会进行一次,用户多次点击产生的结果一样(delete)

修改在大多场景下结果一样(put)

增加在重复提交的场景下会出现(post)

 

三、解决方案

方法一:ticketId

单次支付请求,也就是直接支付了,不需要额外的数据库操作了,这个时候发起异步请求创建一个唯一的ticketId,就是门票,这张门票只能使用一次就作废,具体步骤如下:1.异步请求获取门票2.调用支付,传入门票3.根据门票ID查询此次操作是否存在,如果存在则表示该操作已经执行过,直接返回结果;如果不存在,支付扣款,保存结果4.返回结果到客户端如果步骤4通信失败,用户再次发起请求,那么最终结果还是一样的

方法二:方法二:分布式环境下各个服务相互调用

这边就要举例我们的系统了,我们支付的时候先要扣款,然后更新订单,这个地方就涉及到了订单服务以及支付服务了。用户调用支付,扣款成功后,更新对应订单状态,然后再保存流水。而在这个地方就没必要使用门票ticketId了,因为会比较闲的麻烦(支付状态:未支付,已支付)步骤:1、查询订单支付状态2、如果已经支付,直接返回结果3、如果未支付,则支付扣款并且保存流水4、返回支付结果如果步骤4通信失败,用户再次发起请求,那么最终结果还是一样的对于做过支付的朋友,幂等,也可以称之为冲正,保证客户端与服务端的交易一致性,避免多次扣款。

 

转载于:https://www.cnblogs.com/wuzhengzheng/p/10422461.html

你可能感兴趣的文章
ae arcgis engine 关于面转线的方法和注意事项
查看>>
[小工具] chrome上日语翻译工具
查看>>
扩展内置数据类型要注意先检测
查看>>
关于设计
查看>>
5、csdn中的一些java大牛
查看>>
第十五讲、组合模式
查看>>
hadoop-2.6.0.tar.gz + spark-1.6.1-bin-hadoop2.6.tgz的集群搭建(单节点)(CentOS系统)
查看>>
Logstash-2.4.1的下载(图文详解)
查看>>
动态规划
查看>>
积木代码 加渲染合并
查看>>
读《构建之法》第四章有感
查看>>
018,函数2 形参和实参
查看>>
2013/07/11 中科院软件所就业讲座总结
查看>>
Linux源代码编译
查看>>
Til the Cows Come Home (dijkstra算法)
查看>>
Java内存区域
查看>>
欧拉函数
查看>>
数字三角形W
查看>>
算法4-7:关联数组的顺序接口
查看>>
js获取昨天今天和明天
查看>>