最近在对开发完的项目进行测试,于是用到了Jmeter来进行压力测试……
这里准备压测的是一个获取详情的方法,在获取详情的通知更新阅读量!
上图中代码的逻辑是:
1. 根据ID获取实体
2. 判断实体是否存在
3. 使用三目运算获取当前阅读量
4. 更新阅读量
5. 获取详情
同时,我们再将当前操作的数据库表的阅读数展示出来。
↓↓↓↓↓往下看↓↓↓↓↓
然后就开始使用Jmeter进行压力测试,等待短暂的2秒钟后,产生了结果!
↓↓↓↓↓往下看↓↓↓↓↓
这里就出现问题了!
我们在Jmeter中模拟的100个用户,同时请求这个这个接口的实现方法
此时的数据库中read_count值应该为100,不知为什么现在只有4
于是乎,分析一下业务代码中出现了什么问题
这里是在程序中获取到阅读量,再在业务逻辑层中进行自增以后,再更新到数据库。
这样难免产生了一个问题,我们用两个用户来模拟一下这个问题:
用户A | 用户B |
---|---|
发起请求 | |
数据库查询,获取阅读量=0 | |
阅读量自增,修改阅读量=1 | |
发起请求 | |
数据库查询,获取阅读量=0 | |
提交,此时数据库中的阅读量=1 | |
阅读量自增,修改阅读量=1 | |
提交,此时提交的阅读量=1覆盖了用户A的更新 |
既然找到了问题所在,那就直接把自增操作放到数据库中。