在上周五的接口压力测试中,编写的一个查询课程详情出现了失败,查看后台日志发现是MybatisPlus报错,大致错误是:selectOne but found 2。老司机一看就明白是数据库包含有多条重复数据。
经过对数据库有针对性的排查,脏数据很快被清理出来了。但是问题来了,究竟是什么原因造成脏数据的呢?我仔细排查了接口的相关代码,大致逻辑为:首先从记录表查询课程记录,如果不存在,则插入,否则就更新。相关伪代码如下:
//查询是否存在课程记录
RecordDo recordDo = recordMapper.selectOne(...);
//如果记录不存在
if(recordDo!=null){
//插入操作
insert();
}
else{
//更新操作
updateById();
}
我相信很多同学在业务中都写过类似的代码,这是一个十分常见的case。在日常使用过程中也按照预期的运行了,然而bug总是悄悄的到来,不知不觉数据库中就莫名多了一条脏数据。最开始的时候以为是之前代码没有完善,导致脏数据没有清理,然而同样的情况在后期再次出现了。凭借直觉应该是并发造成的,但是手动模拟并发比较麻烦,而常用的接口测试工具postMan似乎也是串行,于是,jmeter出现在了我的视线中。
jmeter是依据Java编写的,而最新的要求JDK1.8。这条要求相信对于大家都是十分easy。
- 首先进入jmeter官网:https://jmeter.apache.org/download_jmeter.cgi下载。
- 进入bin目录
- 执行
sh jmeter
命令。
最后启动最上方绿色三角即可进行测试。
很快,bug无处遁形,我能清晰的观看到在简单的并发操作下,同时插入了两条一样的数据。当然,如果解决并发下重复提交的问题,这就涉及到分布式锁了,这并不在本章节的范围之类了。本次仅仅是通过jmeter模拟并发请求来复现bug,如果你的项目也需要用到并发测试,那么我强烈推荐你使用jmeter,简单实用。
网友评论