记录一次不同接口之间并发导致的生产问题
一、问题描述:
用户在购物的一个订单中使用了3000多比红包;红包是平时通过签到分享获得的,每笔几分到几毛钱。我们系统整个订单流程大概是,用户加车的时候会计算可以用多少钱的红包,并将计算结果保存在一个订单奖励明细表中,记录的状态为待处理;提交订单的时候我们会扣账户下对应的红包,并将订单奖励明细表中的状态改为已发放,提交订单的数据库操作包括扣减用户账户下的红包、更新明显表的状态为已发放,记录审计记录,记录用券资源通知记录等表,这些表的操作都是在一个事务中进行的,并且我们会判断数据库实际的更新条数和预计要跟新的条数是否一致,如果不一致会回滚数据,也就是做了数据库防并发处理,所以这些表要么都操作成功要么都失败,但是实际在定位问题的过程中发现红包被扣了,但是明细表数据没了;提交订单业务执行时间花费了9秒,正常的超时或者异常回滚会加回红包,更新明显状态数据为待处理,与实际的现状不符合;会删除明显表的操作是在加车的时候,加车的接口我们会计算优惠,并将优惠数据记录到奖励明细表中,记录前我们会先根据购物车的单号做下防重复判断,如果单号之前已经提交过订单会报错,如果单号之前没提交过订单,我们会删除单号之前记录的优惠数据,将新的优惠计算结果也就是用红包的结果记录下来,但是由于删除之前数据的时间我们没有带上原来的状态去删除导致数据被删除了。
二、接口执行顺序逻辑描述
【1】、购物车接口
a、防并发
b、其他业务逻辑
c、计算活动、券、红包的优惠
d、根据单号查询该单之前是否以提交订单
e、如果未提交订单则删除之前数据,记录新的数据;在事务中操作
【2】、提交订单的接口
f、防并发
g、优惠匹配校验等其他业务逻辑判断
h、在事务中跟新红包、券、记录订单奖励明显等
该问题产生的原因是用户在第一次加购物车,然后提交订单后,由于提交订单的时间长,提交订单没处理完,他退出到加车的业务去了,同一个订单号又调用了购物车的接口,在h操作执行完前d操作发现订单未提交,然后h操作执行完成,接着e操作将明显数据删除了
三、问题原因分析,与解决办法
【1】购物车的接口和 提交订单的接口用的不是一个防并发锁:我们不能将两个接口并发锁改成一个,否则与设计原则不符。
【2】两个接口交替执行,数据删除操作的时候没有带着原预期状态去删除,因此我们的处理办法是删除的时候带着原来的预期状态(待处理状态去删除),然后购物车的接口也判断插入条数是否与计算的条数一致,不一致返回加车失败。
记录一次不同接口之间并发导致的生产问题相关推荐
- EntityFramework Core并发导致显式插入主键问题
.NET Core 1.1单元测试问题 我们循序渐进,首先从单元测试开始说起,可能其中就有你在.NET Core上进行单元测试会遇到的问题,别着急,不妨一看.我们需要创建.NET Core类库,,如下 ...
- 量子计算机与人脑接口,首次实现25个量子接口之间量子纠缠 清华刷新纪录
4月26日,清华大学教授段路明正在实验室里指导实验. 清华大学供图 清华团队刷新量子接口纠缠数目纪录 薛定谔的猫.爱因斯坦和波尔的辩论--100多年前科学家把量子力学带进大众视野,从此对于量子力学的探 ...
- 一台无线路由器通过网线连接台式计算机最多可以连几台计算机,如图所示,无线路由器是一种支持有线和无线连接的网络设备.可以通过后排接口同时连接多台电脑实现有线连接,则各接口之间是...
题目所在试卷参考答案: 2016年湖北省咸宁市中考物理试卷 参考答案与试题解析 一.选择題(本大题共10小题,每小题2分,共20分) 1.某校组织学生参加体育中考.以下记录的部分体检数据中,不合理的是 ...
- python并发1000个http请求_php下api接口的并发http请求
php下api接口的并发http请求 ,提高app一个页面请求多个api接口,页面加载慢的问题: func_helper.php /*** 并发http请求** [* 'url' //请求地址* 'm ...
- Java接口多线程并发测试 (一)
本文为作者原创,禁止转载,违者必究法律责任!!! 本文为作者原创,禁止转载,违者必究法律责任!!! Java接口多线程并发测试 一,首先写一个接口post 请求代码: import org.apach ...
- 25接口之间的单继承
Demo01Relations.java package Relations; /* * 1.类与类之间是单继承的.直接父类只有一个. * 2.类与接口是多实现的.一个类可以实现多个接口. * 3.接 ...
- php redis decr_对于高并发的问题你知道怎么处理吗?php接口如何处理并发问题
对于商品抢购等并发场景下,可能会出现超卖的现象,这时就需要解决并发所带来的这些问题了 在PHP语言中并没有原生的提供并发的解决方案,因此就需要借助其他方式来实现并发控制. 方案一:使用文件锁排它锁 f ...
- 解决前后台发送请求或者接口之间发送请求乱码的问题
前后台传中文乱码: 前台使用encodeURI 进行编码 后台使用decode进行解码 如果接口之间调用出现乱码.接收方是????这种.传送方式明文的处理方式: 发送方使用decode 进行编码: 接 ...
- Java中抽象类和接口之间的区别
一些受欢迎的访谈问题是"抽象类和接口之间有什么区别","什么时候使用抽象类以及什么时候使用接口". 因此,在本文中,我们将讨论这个主题. 在探讨它们之间的差异之 ...
最新文章
- vue-concise-slider vue滑动组件
- 【bzoj1486】【[HNOI2009]梦幻布丁】启发式链表合并(详解)
- 【C#】VS2017 winform 打包
- Upload-Labs(11-15)
- consul运维入门
- 如何基于MindSpore实现万亿级参数模型算法?
- 用Python推送书籍到Kindle
- Houdini使用Python给点连线
- Java生成随机数的4种方式
- 电商大数据“杀熟”套路有哪些
- 对象存储是什么?看过就明白了
- Java学习笔记(五):Java多线程(细致入微,持续更新)
- 《必然》二、奔跑吧,所有人都是菜鸡
- 近来开发工作不忙,零零散散整理的Java基础
- 链改重塑信任,打造零风险的产业生态体系!
- java pdf转图片原理_pdf转图片程序(java实现)
- GrabCut python实现
- Android音视频开发:MediaRecorder录制音频
- 腾讯云和阿里云对比哪个好?云计算优势测评
- java base64转图片
热门文章
- 使用keytool 生成证书
- linux matplotlib 中文显示乱码
- Shell学习之IF的使用
- 手机腾讯网mt2.0增量更新算法优化小记
- Oracle数据库外部的身份认证方法
- CCNP 640-892知识点中文精简解释
- 第一章 计算机网络概述[知识点+课后习题+练习题]
- centos将某一目录权限给用户_CenTOS7使用ACL控制目录权限,只给某个用户访问特定目录...
- python get请求带参数_python_request的安装及模拟json的post请求及带参数的get请求
- 柔性穿刺针有限元模型