售后更新出现问题分析-幂等和防重

news2024/11/10 13:40:39

2024-08-27 早上测试提交BUG,说售后单状态流转不对,吓得我一激灵,赶紧打开IDEA 查看代码,发现售后这块代码没有动过呀,咋回事?

流程是这样的: 测试模拟用户下单,提交订单后付款,然后用户又进行退款操作,需要商家审核售后,商家审核通过的话,进行退款操作,售后单更新状态售后完结。

然后这个单据进行了退款操作,但是售后单状态没有完结。

自己又顺着测试的步骤操作了一遍,也没有复现问题,测试自己也不能没有这个问题。

没有办法,硬着头皮下载日志回来看看吧!

这两个单都是未发货退款,500002280004 正常售后退款成功,

500002280003 退款成功但是售后状态不对

直接在日志里面查询售后单号:

发现这个售后单在不到 0.1秒 请求了两次,整个售后退款流程代码一秒才完成

即使在代码对售后状态进行了校验也是无用,因为并发请求时,上一个售后代码没有执行完成,事务没有提交,新来的请求读取的售后状态也是未完结的,可以继续往下执行代码,

执行到退款代码时,该同学意识到可能重复退款,加了一把分布式锁,也算不幸中的万幸,没有造成重复退款

那么我现在要做的就是在在售后接口进行防重,先说一下方案,就是在入口处添加一把分布式锁,获取到锁就往下执行,代码执行完成,删除锁,防止并发重复请求。

详细分布式锁使用可以看我的另一篇文章:

AOP自定义注解防重-CSDN博客

再来说一下幂等和防重的概念:

幂等性和防重复是确保软件系统正确性的重要概念。下面通过一些具体的例子来解释这两个概念:

### 幂等性(Idempotence)

1. HTTP GET 请求:当你对一个 HTTP GET 请求进行多次调用时,比如请求一个网页,无论请求多少次,返回的网页内容都是相同的。这就是幂等性的体现。

2. 数据库更新操作:假设有一个 SQL 更新语句 `UPDATE users SET age = 30 WHERE id = 1`。无论这个语句执行一次还是多次,只要条件 `id = 1` 不变,用户1的年龄都会被设置为30岁。

3. 设置键值对:在 Redis 中使用 `SET` 命令设置一个键值对是幂等的。比如 `SET key value`,无论执行多少次,只要键名不变,键对应的值都会是最后一次设置的值。

4. 删除操作:删除一个文件或数据库记录的操作也是幂等的。无论执行多少次,文件或记录只会被删除一次。

### 防重复(Idempotent Message Processing)

1. 订单系统中的唯一订单号:在订单系统中,每个订单都有一个唯一的订单号。当处理订单时,系统会检查订单号是否已经存在,如果存在,则不会重复处理同一个订单。

2. 消息队列中的消息唯一标识符:在消息队列中,每条消息都有一个全局唯一的标识符。消费者在处理消息前会检查这个标识符,如果已经处理过,则不会再次处理。

以下是一些具体的例子:

1. 支付系统:在支付系统中,每次支付请求都会生成一个唯一的交易ID。即使支付请求因为网络问题被重复发送,系统也会通过检查交易ID来避免重复扣款。

2. 银行转账:当你通过银行应用进行转账时,每次转账操作都会生成一个唯一的交易号。即使你多次点击“确认转账”,银行系统也会通过交易号来确保转账操作只执行一次。

3. 社交媒体发帖:在社交媒体平台上,当你发布一条帖子时,即使因为网络延迟你多次点击“发布”,平台也会通过检查帖子的唯一标识符来确保你的帖子只被发布一次。

4. 邮件发送:邮件发送系统通常会为每封邮件分配一个唯一的消息ID。即使因为某些原因邮件发送请求被重复触发,系统也会通过消息ID来避免重复发送同一封邮件。

通过这些例子,我们可以看到幂等性确保了操作重复执行不会产生副作用,而防重复机制则是通过系统设计来避免操作被重复执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2083184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[MOCO v2] Improved Baselines with Momentum Contrastive Learning

1、目的 结合SimCLR和MoCo,实现SoTA 2、方法 ​​​​​​​ ​​​​​​​ 将SimCLR的两点设计融入MoCo中: 1)MLP projection head 2-layer, hidden layer 2048-d, with ReLU 2)more data augmentation blur a…

【专项刷题】— 链表

1、2两数相加 - 力扣(LeetCode) 思路: 只要有任意一个链表还没有为空的时候就继续加,当链表为空的时候但是t不尾0,还是进入循环进行操作 代码: public ListNode addTwoNumbers(ListNode l1, ListNode l2) {…

【HuggingFace Transformers】LlamaModel源码解析

LlamaModel源码解析 1. LlamaModel 介绍2. LlamaModel类 源码解析3. 4维因果注意力掩码生成 1. LlamaModel 介绍 LlamaModel 是一个基于 Transformer 架构的解码器模型,用于自然语言处理任务。它是 Meta 的 LLaMA (Large Language Model Meta AI) 系列的一部分&…

Spatial Structure Constraints for Weakly SupervisedSemantic Segmentation

摘要 由于易于获得,图像级标签在弱监督语义分割任务中很受欢迎。 由于图像级标签只能指示特定类别对象的存在或不存在,因此基于可视化的技术已被广泛采用来提供对象位置线索。由于类激活图(class activation map, CAMs)只能定位目标中最具辨识性的部分…

API测试基础知识(基本概念、测试方法、测试工具)

在进行API测试之前,我们先了解一下 什么是API? API(全称Application Programming Interface)是两个单独的软件系统之间的通信和数据交换。实现API的软件系统包含可以由另一个软件系统执行的功能/子例程。 什么是API测试 API测…

ATL宁德新能源25届校招社招:Verify测评及四色测评考什么?真题分析

ATL新能源科技有限公司-Verify测评邀请题型介绍 a. 测评内容包含演绎推理数字推理两部分,大约用时45分钟左右; b. 正式测评后即开始计时,每项测评时限为18分钟。 c. 为确保测评顺利进行,不影响测评结果,请优先使用电…

分享5个专业写论文神器自动生成的软件工具

在当今学术研究和写作领域,AI论文写作工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿,还能进行内容优化、查重和排版等操作。以下是五款专业写论文神器自动生成的软件工具,其中特别推荐千笔-AIPasspap…

入职后,我发现工作内容和自己想象中的不太一致。。

2018年6月,大三暑假进行时,实习第二天上班 昨天王工跟我说最好统一开发工具用eclipse,今早我瞄到其实也有同事用idea。 eclipse还得学习,用idea算了,随便上网找个盗版的就好咯,不纠结这么多。 公司被逮到…

驱动:dht11驱动程序

DHT11读写时序详解(时序上板实测)_mcu 读取thd11 接收数据开始-CSDN博客文章浏览阅读733次,点赞20次,收藏21次。DHT11有两种,一种三线制,一种四线制。其中都包括1个VDD,1个GND,和1个…

常见几种简单的深度学习算法在生物医学数据领域的特点和不足

本团队提供生物医学领域专业的AI(机器学习、深度学习)技术支持服务。如果您有需求,请扫描文末二维码关注我们。 通过表格的形式,总结了常见几种简单的深度学习算法在生物医学数据领域的特点和不足(仅个人理解&#xff…

HarmonyOS NEXT 实战开发:实现日常提醒应用

为什么要开发这个日常提醒应用? 最近鸿蒙热度一直不减,而且前端的就业环境越来越差,所以心里面萌生了换一个赛道的想法。HarmonyOS NEXT 是华为打造的国产之光,而且是纯血版不再是套壳,更加激起了我的好奇心。ArkTS是…

【网络安全】分析cookie实现PII IDOR

未经许可,不得转载。 文章目录 正文正文 目标:公共电子商务类型的网站,每月有大约6万到10万访问者,注册用户大约有5万。 存在一个查询个人资料的端点/GetProfiledetails,以下是完整的请求和响应: 我发现,cookie非常类似于base64编码后的结果,于是我将其进行base64解码…

WEB开发---使用HTML CSS开发网页实时显示当前日期和时间

自己刚开始学习html css知识&#xff0c;临时做个网页&#xff0c;实时显示当前日期和时间功能。 代码如下&#xff1a; test.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport&q…

C#利用ffmpeg借助NVIDIA GPU实现实时RTSP硬解码+硬编码录制MP4

目录 说明 效果 项目 代码 下载 说明 利用周杰的开源项目 Sdcb.FFmpeg 项目地址&#xff1a;https://github.com/sdcb/Sdcb.FFmpeg/ 代码实现参考&#xff1a;https://github.com/sdcb/ffmpeg-muxing-video-demo 效果 C#利用ffmpeg借助NVIDIA GPU实现实时RTSP硬解码硬…

004-OpenFeign服务接口调用

文章目录 1 简介2 OpenFeign 通用步骤2.1 建module2.2 改POM2.3 写YML2.3 主启动类2.4 cloud-api-commons模块修改2.4.1 按照架构说明进行编码准备2.4.2 引入openfeign依赖2.4.3 新建服务接口PayFeignApi 2.5 编写controller2.6 测试2.7 总结 3 OpenFeign高级特性3.1 注意3.2 O…

QGC 修改为双路视频介绍

文章目录 一、效果图二、简要流程关于QGC地面站其它文章请点击这里: QGC地面站 一、效果图 右下角切换视频通道; 左下角切换地图与当前的视频 二、简要流程 ● C++ 后端 C++ 中利用 QGC 原有的红外热成像视频流,修改几处即可 // src\VideoManager\VideoManager.cc Vi…

快排找基准值之挖坑法

思路&#xff1a;把数组里第一个数据拿出来记为标准值&#xff0c;然后两边交替&#xff0c;从右往左找比基准值小的数据放到前面缺数据的坑里。放完后该位置也缺数据成为了新的坑&#xff0c;再把坑的下标移到新的位置。 从左到右找比基准值大的数据&#xff0c;后面同理。 …

装饰器(Decorators)的实现

1、Python 中的函数可以像普通变量一样当做参数传递给另外一个函数&#xff1b; 2、装饰器&#xff1a;不修改函数源码但是要实现给函数添加额外功能。python使用语法糖即来实现装饰器。 3、装饰器的作用&#xff1a; &#xff08;1&#xff09;抽离出大量函数中与函数功能本…

Spring框架 基础介绍

目录 Spring框架 IOC: AOP: 一站式&#xff1a; spring搭建 Maven 导入 spring 核心基础 jar 编写 spring 配置文件 编写一个 User 实体类 测试 spring IOC(控制反转) 依赖注入&#xff1a; 1、通过属性注入 2、通过构造方法注入 spring中bean管理 1、基于xml配置方…

AI模型:追求全能还是专精?

AI模型&#xff1a;追求全能还是专精&#xff1f; 近日&#xff0c;OpenAI预计在秋季推出代号为“草莓”的新AI。从专注于数学问题到处理主观营销策略&#xff0c;"草莓"模型展现出惊人的多样性。而这种全能型 AI 是否代表了未来趋势&#xff1f;相比专攻于某一领域…