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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

### 幂等性(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.rhkb.cn/news/410099.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于顺序表实现通讯录功能项目

本文通过顺序表实现通讯录的功能,增删查改数据 首先实现顺序表的功能,再用顺序表实现通讯录的功能 顺序表中的成员为一个结构体对象con,自定义的类型,里面包含着联系人的姓名性别年龄电话地址 seqlist.h:顺序表头文…

摩尔线程 × 智汇云舟|打造视频孪生国产解决方案

近日,摩尔线程与国内数字孪生头部企业和视频孪生首倡者智汇云舟达成深度战略合作,双方将在技术融合、产品共创和市场推广领域加强合作,共同研发面向未来的视频孪生国产化解决方案,推动视频孪生技术在国内关键领域的应用落地&#…

闲置物品|基于SprinBoot+vue的校园闲置物品交易平台(源码+数据库+文档)

校园闲置物品交易平台 目录 基于SprinBootvue的校园闲置物品交易平台 一、前言 二、系统设计 三、系统功能设计 5.1系统功能实现 5.2管理员模块实现 5.3用户模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xf…

ZBrush入门使用介绍——11、边缘环

大家好,我是阿赵。   继续介绍ZBrush的用法。这次看看边缘环的使用方法。我个人的感觉,边缘环有点类似于3DsMax之类软件的挤出功能,可以沿着环形的面,添加凹凸效果。   边缘环工具入口在几何体编辑里面: 一、 边…

【python3.8安装报错】lmportError: DLL load failed while importing ft2font: 找不到指定的模块

客户需求背景: 安装python3.8无法运行,报错 lmportError: DLL load failed while importing ft2font: 找不到指定的模块 考虑兼容性问题 这个问题首先需要考虑的是是否是python版本太高了,因为python3.9不支持win7,而python3.8版…

arm64--异常处理与中断处理

一、异常等级 EL0 非特权模式,用于运行应用程序 EL1为特权模式,用于运行操作系统内核 EL2用于运行虚拟化管理程序 EL3用于运行安全世界的管理程序 二、同步异常与异步异常 1. 同步异常:处理器执行某条指令而直接导致的异常,…

有效提高媒体曝光率,智能推荐为什么是“最大的计算系统之一”?

导语:我认为很少有人意识到,推荐系统是世界上构想过的最大的计算系统之一。——Jensen Huang  在信息过载的时代背景下,智能推荐系统已广泛应用于电子商务、社交媒体、新闻资讯、视频音乐、旅游出行等领域,为用户提…

力扣经典题目之->单值二叉树(递归判断)

一:题目 本博客采用此模型: 二:思路 单值二叉树即所有值相等的二叉树 1:递归的大事化小思路即: 将当前节点与它的左右子节点进行比较,如果不相等,则直接返回false。如果相等,则递归…

记一次 .NET某实验室自动进样系统 崩溃分析

一:背景 1. 讲故事 前些天有位朋友在微信上联系到我,说他们的程序在客户那边崩掉了,让我帮忙看下怎么回事,dump也拿到了,那就上手分析吧。 二:WinDbg 分析 1. 哪里的崩溃 既然是程序的崩溃&#xff0c…

基于状态机实现WIFI模组物联网

1.0 状态机框架原理 如果成功的话就连接热点,如果失败就返回AT通信检查,如果AT通信检查还是失败就放回硬件复位这个状态,如果热点链接成功,就连接MQTT指令,如果失败就返回AT通信检查,如果成功就连接云平台通…

MySQL集群技术

一、MySQL部署 1.源码编译 实验环境为rhel7 安装依赖性 [rootmysql-node1 ~]# yum install cmake gcc-c openssl-devel \ ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm rpcgen.x86_64 -y [rootmysql-node1 ~]# tar zxf mysql-boost-5.7.44.tar.gz 源码…

达梦数据库的系统视图v$object_usage

达梦数据库的系统视图v$object_usage 在达梦数据库(DM Database)中,V$OBJECT_USAGE 视图提供了关于数据库对象的使用情况和统计信息。这些对象可以包括表、索引、视图、存储过程等。通过 V$OBJECT_USAGE 视图,数据库管理员可以监…

贵金属市场展望:黄金独领风骚,钯金、铂金与白银承压

黄金新高可期,避险魅力不减 黄金市场持续升温,近期价格屡创新高。随着全球经济不确定性增加及美联储降息预期的增强,黄金的避险属性得到进一步凸显。市场普遍预期,若美联储在年内维持宽松货币政策,黄金价格有望继续上扬…

新迪天工®看图,专业的三维CAD看图工具

替代专业CAD软件,方便查看各种三维和二维CAD图纸 新迪天工看图是一款功能强大的三维模型和二维图纸查看工具,能帮助制造企业以较低的成本、较高的数据安全性实现产品设计数据的跨业务浏览和交互。 应用场景 1、设计图纸评审 可直接对三维模型和二维…

【数据结构】—— 树和二叉树

1、树的概念2、树的相关术语3、树的常见表示方法4、树的实际应用5、二叉树的相关概念和性质6、二叉树的顺序存储(堆)6.1 堆的概念6.2 堆的结构和接口6.3 堆的初始化和销毁6.4 堆的插入6.5 堆的删除6.5 取堆顶数据6.6 获取有效节点个数6.7 判空6.8 源代码…

高并发业务下的库存扣减技术方案设计

扣减库存需要查询库存是否足够: 足够就占用库存不够则返回库存不足(这里不区分库存可用、占用、已消耗等状态,统一成扣减库存数量,简化场景) 并发场景,若 查询库存和扣减库存不具备原子性,就可能超卖&…

动态内存管理函数malloc,calloc,realloc,free

malloc 函数原型:void* malloc(size_t size); 这个函数向内存申请一块连续可用的size大小的空间,并返回指向这快空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针,因此ma…

Facebook AI策略全解:从数据分析到智能推荐的成功秘诀

在数字化时代,人工智能(AI)已成为推动科技发展的核心力量。Facebook,作为全球领先的社交网络平台,正通过先进的AI策略来优化用户体验和平台运营。从数据分析到智能推荐,Facebook的AI策略涵盖了多个方面&…

Git 分支操作全解析:创建、切换、合并、删除及冲突解决

“ 在现代软件开发中,高效的版本控制是确保项目成功的关键。Git 提供了强大的分支管理功能,使得开发者能够独立地进行功能开发、修复 bug 和进行紧急修补。本文将深入探讨 Git 分支的基本操作,包括创建、切换、合并和删除分支,同时…

Linux基础 - yum、rzsz、vim 使用与配置、gcc/g++的详细解说

目录 一、Linux 软件包管理器 yum A.什么是软件包? B.关于rzsz,yum的配置 1.安装 sz,rz 命令: a.执行命令sz可将linux中的文件传输到Windows中 b.执行rz命令可将Windows中的文件传输到linux 2.scp XXX.tgz 用户名另一台lin…