• 0
  • 0
分享
  • 业务逻辑异步执行引发的偶发异常分析及设计思考——软件测试圈
  • 曼倩诙谐 2024-03-19 11:29:32 字数 2320 阅读 994 收藏 0

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

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

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

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

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

1-1.png

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

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

1-2.png

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

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

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

1-3.png

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

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

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

  如下图所示:

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

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

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

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

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

1-4.png

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

1-5.png

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

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

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

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

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

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

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

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

1-6.png

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

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

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

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

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

  4、业务设计。

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

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

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

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

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

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


作者:郭朝兴、达日汗等    

来源:http://www.51testing.com/html/55/n-7799955.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 读者提问:免费好用的在线身份证号码生成工具,有推荐的吗 ?阿常回答:有,这 3 款在线身份证号码生成工具,推荐使用 !1、随机身份证号码生成包含功能:设置出生地、出生日期、性别、生成个数。官网地址:http://sfz.uzuzuz.com2、随机身份证号码生成包含功能:设置出生地、出生日期、性别、生成个数。官网地址:http://www.chineseidcard.com3、在线身份证号码生成器包含功能:设置生成个数(无需设置出生地、出生日期、性别,直接生成身份证号码)。官网地址:https://www.suijidaquan.com/shenfenzheng阿常碎碎念:平时的测试...
            0 0 36363
            分享
          • 我爬取了8483条测试工程师招聘需求,竟发现……软件测试要做些什么?软件测试需要掌握什么技能?软件测试有发展前景吗?……针对以上问题,谭叔写过文章介绍,也做过线上分享,你可以翻翻之前推送的文章。但我总觉得还差个东西——软件测试的职业环境。就我个人来说,我每隔一段时间(或半年、或一年)便会审视、总结软件测试职业,给自己的未来一个交代。最近,借金三银四招聘旺季的契机,我爬取了某招聘网站8483条测试工程师的用人需求,通过分析这些数据,跟大家讲一讲软件测试的职业环境。具体请看:数据爬取、数据清洗、数据分析数据爬取我不喜欢重复造轮子,在分析之前,我依旧在网上浏览,却发现并无多少博主通过分析招聘需求来研...
            14 14 3274
            分享
          •   移动端APP的测试处于不断探索,不断进化的过程中,而手机银行是目前各大银行金融科技战争的主要阵地,如何更好更快地对手机银行进行测试是个热门话题,也是个值得深入研究的课题。本文以某行手机银行测试为例,描述了SoloPi用例执行录制转为Appium脚本后集成至jenkins,并完成自动化部署后的真机并发执行实践流程,并对Appium 1.15.1和安卓10使用中存在的一些问题提供了解决方法,希望能够对移动端APP的测试提供更多的借鉴。  1、SoloPi与用例的自动化构建及测试  SoloPi是蚂蚁金服研发的一款移动端APP测试工具,提供脚本录制、编辑、回放,结果展示以及一机多控,即通过设备间...
            0 0 2001
            分享
          •   苹果公司今天推出了 iOS 17.2,为 iPhone 15 Pro 和 iPhone 15 Pro Max 用户提供了录制空间视频的功能。通过这项新功能,用户可以在即将推出的MR头显 Apple Vision Pro 上进行3D拍摄,体验他们最喜爱的回忆和特殊时刻。  苹果公司解释说,为了创建3D视频,iPhone 在录制时会同时使用主摄像头和广角摄像头。然后,这些视频会以单个文件的形式保存在照片应用中名为"空间"的新相册中。这些视频还将通过 iCloud 在不同设备间同步,空间视频的拍摄分辨率为 1080p,每秒 30 帧。  空间视频录制可在"设置&qu...
            0 0 1020
            分享
          •   Selenium是一个用于自动化Web浏览器的Python库。它提供了一组强大的工具和API,使开发者能够以编程方式控制浏览器的行为,模拟用户与网页的交互。  Selenium可以用于各种Web自动化任务,包括网页测试、数据采集、UI自动化等。它支持主流的Web浏览器,如Chrome、Firefox、Safari等,并提供了丰富的功能,例如:  页面导航:Selenium可以模拟用户在浏览器中输入URL或点击链接来导航到不同的网页。  元素定位和操作:开发者可以使用Selenium定位页面上的元素,例如文本框、按钮、下拉菜单等,并进行点击、输入文本、提交表单等操作。  页面截图:Selen...
            0 0 1249
            分享
      • 51testing软件测试圈微信