事件:
项目即将上线,测试,观察日志,发现一sql在dal.xml中一直刷日志,但对应在biz日志却是空的
排查步骤:
1、查看对应日志的sql,在项目中找到对应代码所在位置,查看入口与代码逻辑
接口是用作补偿,使用的是简答的controller调用业务,调度配置在任务系统,该sql是在补偿中轮询修改查询符合补偿要求的sql
1、怀疑测试在压测,dal日志也打在这个文件中
向对应测试人员提出问题,得到回复无人操作
2、仔细观察该业务代码,该业务代码如下:
根据代码判断出现死循环执行职能是一个原因:
total>0进入执循环,查询出道的集合却是空的,导致无法执行total--,所以死循环
观察total的得到代码,发现它是查询sql的count数量,两边应该一致的,因此出现问题的原因感觉是安全性问题,就是进入循环后数据被修改了,后面发现好多操作都会修改同一张表的调度重试次数字段,就是说好多表与该操作有关设计有问题。
调度重试次数应该存储在调度记录表中而非数据表中。
这段diamante写的分页查询的结果没问题,却危险,if没有考虑else的情况,改为标准分页形式会更加可靠。
写代码需要思考,代码的含义,copy然后出问题抛然后甩只能。。。