开发验证一切正常,而测试人员在性能测试时偶发报错,如何解决?

在业务系统逻辑实现中,经常涉及异步执行、异步更新场景的开发和使用。但在性能测试中,经常会出现因为异步逻辑设计不合理引发的不可预知问题,比如在开发验证时一切正常,测试人员在性能测试时偶发报错。

本文从Spring事务、业务逻辑顺序、数据库死锁等方面介绍在项目研发中遇到的几种异常场景供读者学习。

一、事务延迟提交引发的异步执行偶发问题分析和设计思考。

1、场景说明:当前有两个线程A、B,A是生产者,B是消费者,A、B两个线程异步执行,A每次从队列获取n条待处理任务,然后依次处理每条任务,包括业务逻辑处理、远程过程调用、更新数据库、将任务放入消费者队列,B从消费队列获取任务进行处理。

2、问题分析:消费者B从队列获取到待处理任务列表并逐条处理任务时,会从数据库查询任务的信息,当生产者未完成n条数据的全部处理过程从而造成Spring事务未整体提交时,消费者查询到的数据为生产者未提交的数据,类似与数据库的read uncommited。

3、原理分析。@Transactional是spring中声明式事务管理的注解配置方式,通过@Transactional注解可以帮助我们把事务开启、提交或者回滚的操作通过AOP的方式进行管理,免去了重复的事务管理逻辑,减少对业务代码的侵入,使我们开发人员能够专注于业务层面开发。

@Transactional注解的切面逻辑类似于@Around,在业务逻辑执行之前开始事务,然后执行具体的业务逻辑,业务逻辑执行完成后,根据是否异常提交或者回滚事务。

在该场景中,由于@Transactional注解配置在获取n条数据然后对每条数据处理的最外层,只有对n条数据处理完成后才能提交事务,但是在处理完成每条任务后已经将任务放入消费者队列,导致消费者处理任务时无法从数据库获取到最新的信息,导致任务处理失败。

4、设计规范。数据库事务中如果进行诸如调用第三方系统、上传下载文件、复杂计算等耗时操作,应在数据库事务外进行耗时操作,避免操作阻塞或者缓慢引起数据库连接耗尽。

5、优化方案。缩小事务生效范围,将@Transactional注解从最外层移动到处理每条数据更新DB的逻辑上,如下图所示:将逻辑处理、远程调用、放入队列等逻辑从事务生效范围内移除。修改后再次测试验证,可以发现不会再出现消费者获取到旧数据的问题。

6、测试设计。对于涉及事务逻辑的功能,需要设计场景验证是否存在事务延迟提交造成状态查询不一致的问题。

二、业务执行时序错乱造成的状态不一致问题分析与设计思考。

1、场景说明:在多个线程并行执行,并可能对同一张表的同一条记录更新时,因执行时序不一致造成状态异常,最终造成结果错误。

如下图所示:

步骤1:线程A调起任务插件执行;

步骤2:任务插件调用第三方服务执行具体业务;

步骤3:线程A每隔5S轮询任务执行状态并在状态变化时更新数据库;

步骤4:第三方服务执行完成后,更新数据库状态;

步骤5:插件查询任务执行状态并作出响应。

2、问题分析。步骤3、4都会进行数据库状态更新操作,这两个步骤执行顺序的异常,步骤5插件查询到的状态就会出现不一致,从而导致业务执行的一致性和幂等性无法保证。

3、设计思考。对于多个逻辑可能更新同一条数据的场景,需要考虑逻辑执行顺序和可能出现的风险场景,避免出现最终结果的不一致性。

1)从业务上保证步骤之间的顺序,即确保步骤3一定在步骤4之前执行完成。

2)设计每个步骤更新数据库后唯一状态码,通过不同状态码的流转保证整个业务流程一致性。

4、测试设计。性能测试场景设计时,对正常的业务执行顺序和异常业务执行顺序充分考虑,设计不同的业务场景。

三、异步更新数据库出现数据库死锁问题分析和设计思考。

1、场景介绍。在系统运维过程中,发现大量的数据库操作响应时间比较长,并出现了数据库死锁问题。

2、问题分析。多个线程更新同一张表的多条记录时,由于数据更新时序和事务原因,出现数据库死锁,进而造成数据更新异常。

如下图所示,有两个数据库连接Connection1、Connection2,在时间t1,Connection1、Connection2分别锁定key(1),key(2),在时间t2 Connection1、Connection2分别尝试获取锁key(2)、key(1),即获取对方已经占用的锁,就会出现死锁。

3、原理分析。多个数据库更新和插入操作有可能产生死锁,产生条件:

1)多个并发事务(2个或者以上);

2)每个事务都持有锁(或者是已经在等待锁);

3)每个事务都需要再继续持有锁(为了完成事务逻辑,还必须更新更多的行);

4)事务之间产生加锁的循环等待,形成死锁。

4、业务设计。

1)保证消除长事务,避免在事务中进行多条数据的操作。

2)尽量基于primary或unique key更新数据。

3)修改多个表或者多个行的时候,将修改的顺序保持一致。

4)创建索引,可以使产生的锁更少。

5、测试设计。对应多个线程可能异步并发更新相关联的数据时,设计并发压力测试场景,验证是否存在数据库死锁问题发生。

本文介绍了Spring事务配置范围过大、业务逻辑执行顺序控制缺失、事务控制不合理造成数据库死锁等3个场景,深入分析了异常发生原因、逻辑设计注意事项及测试中需要额外关注的场景,希望能够抛砖引玉,给软件开发和测试人员提供有益经验。

文末了:

可以到我的个人号:atstudy-js,可以免费领取一份10G软件测试工程师面试宝典文档资料。同时我邀请你进入我们的软件测试学习交流平台,大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,了解测试行业的最新趋势,助你快速进阶Python自动化测试/测试开发,稳住当前职位同时走向高薪之路。

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

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

相关文章

前端三件套 | 综合练习:模拟抽奖活动,实现一个简单的随机抽取并显示三名获胜者

随机运行结果如下&#xff1a; 参考代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><tit…

P2934 [USACO09JAN] Safe Travel G 题解

题意 给定一张 n n n 个点 m m m 条边的无向图&#xff0c;对于每个除 1 1 1 以外的点 u u u&#xff0c;求在不允许经过原来从 1 1 1 到 u u u 的最短路径的最后一条边时&#xff0c; 1 1 1 到 u u u 的最短路。 保证 1 1 1 到其他点的最短路唯一&#xff0c;无解输出…

git撤回代码提交commit或者修改commit提交注释

执行commit后&#xff0c;还没执行push时&#xff0c;想要撤销之前的提交commit 撤销提交 使用命令&#xff1a; git reset --soft HEAD^命令详解&#xff1a; HEAD^ 表示上一个版本&#xff0c;即上一次的commit&#xff0c;也可以写成HEAD~1 如果进行两次的commit&#xf…

鸿蒙Socket通信示例(TCP通信)

前言 DevEco Studio版本&#xff1a;4.0.0.600 参考链接&#xff1a;OpenHarmony Socket 效果 TCPSocket 1、bind绑定本地IP地址 private bindTcpSocket() {let localAddress resolveIP(wifi.getIpInfo().ipAddress)console.info("111111111 localAddress: " …

配置阿里云加速器

国内镜像中心常用阿里云或者网易云。在本地docker中指定要使用国内加速器的地址后&#xff0c;就可以直接从阿里云镜像中心下载镜像。 2024阿里云-上云采购季-阿里云 根据操作系统来选择。

RequestResponse使用

文章目录 一、Request&Response介绍二、Request 继承体系三、Request 获取请求数据1、获取请求数据方法&#xff08;1&#xff09;、请求行&#xff08;2&#xff09;、请求头&#xff08;3&#xff09;、请求体 2、通过方式获取请求参数3、IDEA模板创建Servlet4、请求参数…

【AUTOSAR】【通信栈】Fls

AUTOSAR专栏——总目录-CSDN博客文章浏览阅读592次。本文主要汇总该专栏文章,以方便各位读者阅读。https://blog.csdn.net/qq_42357877/article/details/132072415?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22132072415%22…

金融知识分享系列之:MACD指标精讲

金融知识分享系列之&#xff1a;MACD指标精讲 一、MACD指标二、指标原理三、MACD指标参考用法四、MACD计算步骤五、MACD分析要素六、根据快线DIF位置判断趋势七、金叉死叉作为多空信号八、快线位置交叉信号九、指标背离判断行情反转十、差离值的正负十一、差离值的变化十二、指…

C语言之数据在计算机内部的存储

文章目录 一、前言二、类型的基本归类1、整型家族2、浮点数家族3、构造类型4、指针类型 三、整型在内存中的存储1、原码、反码、补码1.1 概念1.2 原码与补码的转换形式1.3 计算机内部的存储编码 2、大小端介绍~~2.1 为什么要有大端和小端之分&#xff1f;2.2 大&#xff08;小&…

https代理相对socks5代理有什么优势?

随着互联网的快速发展&#xff0c;代理服务已成为许多人在访问敏感或地理位置受限的网站时所依赖的工具。其中&#xff0c;HTTPS代理和SOCKS5代理是两种最常用的代理服务类型。本文将探讨HTTPS代理相对SOCKS5代理的优势。 1、安全性 HTTPS代理使用SSL/TLS协议对客户端和代理服…

力扣刷题Days20-151. 反转字符串中的单词(js)

目录 1,题目 2&#xff0c;代码 1&#xff0c;利用js函数 2&#xff0c;双指针 3&#xff0c;双指针加队列 3&#xff0c;学习与总结 1&#xff0c;正则表达式 / \s /&#xff1a; 2&#xff0c;结合使用 split 和正则表达式&#xff1a; 1,题目 给你一个字符串 s &am…

[HNCTF 2022 WEEK2]e@sy_flower

获取基本信息 获取关键字符串 进来“开门红” 上一篇博客才发现这个 按u转换为二进制 有个无效db&#xff0c;最简单的花指令 nop掉 重新u一下p一下 就正常了 然后编译完main函数 int __cdecl __noreturn main(int argc, const char **argv, const char **envp) {signed in…

二、python基础

一、关键字&#xff08;保留字&#xff09; 指在python中赋予特定意义的一类单词&#xff0c;不能将关键字作为函数、变量、类、模块的名称 import keyword#利用内存模块keyword print(keyword.kwlist)#输出所有关键 print(len(keyword.kwlist))#利用内置函数len()输出关键字的…

idea项目mapper.xml中的SQL语句黄色下划线去除

问题描述 当我们使用idea开发java项目时&#xff0c;经常会与数据库打交道&#xff0c;一般在使用mybatis的时候需要写一大堆的mapper.xml以及SQL语句&#xff0c;每当写完SQL语句的时候总是有黄色下划线&#xff0c;看着很不舒服。 解决方案&#xff1a; 修改idea的配置 Edi…

视觉问答(Visual_Question_Answering, VQA)介绍

1.背景 VQA&#xff08;Visual Question Answering&#xff09;指的是&#xff0c;给机器一张图片和一个开放式的的自然语言问题&#xff0c;要求机器输出自然语言答案。答案可以是以下任何形式&#xff1a;短语、单词、 (yes/no)、从几个可能的答案中选择正确答案。VQA是一个…

21-分支和循环语句_while语句(中)(初阶)

21-2 代码准备 getchar()&#xff1a;获取字符 int ch getchar(); //把获取的字符的ASCII码值放在ch中 int main() {int ch getchar();printf("%c\n", ch); //ch存的是该字符的ASCII码值&#xff0c;此处以字符形式打印ASCII码值对应的字符putchar(ch); } 运…

java IO 04 对象处理流,序列化

01.序列化和反序列化的作用 重点&#xff1a; 图&#xff1a; 02.对象流ObjectOutputStream和ObjectInputStream ObjectInputStream&#xff1a; ObjectOutputStream&#xff1a; 例子&#xff1a; 例子&#xff1a; 修改要序列化类的话&#xff0c;会出现不同的uid…

sentinel熔断降级

熔断降级 Slot 责任链上的最后一环&#xff1a;熔断降级 DegradeSlot,熔断降级作为保护系统的一种强大手段,可以根据慢调用、异常比例和异常数进行熔断,并自定义持续时间以实现系统保护 规则配置 规则类中属性解析 与控制面板对应 // 其中资源名称在 AbstractRule 里。 pu…

章节2:单词本该这样记

为什么我们记不住单词&#xff1f; 单词不是被胡编乱造出来的&#xff0c;单词是有规律的&#xff0c;单词是符合人类的逻辑的。 单词实际意思结构意义历史文化 我们要怎么记单词&#xff1f; 掌握单词的结构规律了解与单词有关的历史文化灵活巧计&#xff0c;不要太拘泥于…

软考78-上午题-【面向对象技术3-设计模式】-结构型设计模式01

一、适配器模式 1-1、意图 个类的接口转换成客户希望的另外一个接口。 Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 1-2、结构 适配器模式分为&#xff1a; 1、适配器类模式&#xff1b; 2、适配器对象模式 类适配器使用多重继承对一个接口与另…