记一次线上异常bug的定位与调试

相关方法

根据账号绑定的微信id进行登入;

异常原因

根据微信id查询出两条绑定同一微信id的账号,返回包装对象时异常;

记一次线上异常bug的定位与调试

可以直接看出来是在mybatis进行查询时,查询出了两条结果,但是dao方法的返回值只能包装一个对象引起的;

解决方法很简单,就是在其sql中添加一个 limit 0,1  即可避免这种错误的发生;

但是得明白为什么会有这种情况发生,怎么处理多查询出来的数据?

首先确定了一个微信id只能绑定一个账号,但是怎么会出现一个微信id绑定多个账号这种情况出现呢?

于是我通过对其重复绑定的数据进行分析,分析其账号创建时间与更改时间来判断与其相关调用的接口,确定大概的问题出现范围;如根据更新时间可以判断是否有通过“换绑”的形式导致重复绑定;根据重复绑定的账号的创建时间判断问题出现的时间点是否有关系;

在相关接口逻辑中判断会不会出现这种重复绑定的可能:

1、微信注册并登入接口逻辑:先判断该微信id是否绑定,再选择绑定或换绑操作;排除

2、绑定微信接口逻辑:先判断该微信id是否绑定账号,先解绑原来的绑定,再绑定新的账号;排除

3、新接入的微信绑定接口逻辑:先判断开放账号表中微信id是否绑定账号,先解绑原来的绑定,再绑定新的账号;待考虑

之前对数据库中数据的分析结果有了一定的收获,就是重复绑定的数据基本都是一个时间段的前后造成的,而新接入的接口则就在这个时间段中接入,再对该接口相关的表进行分析,发现是新接口接入时,线上数据库迁移数据时未迁移完全,导致在新表中进行微信id绑定判断为未绑定状态,造成了重复绑定的结果;

最终对重复绑定数据的解决方案是:对重复绑定数据进行数据清洗,将新表中与账号表中没有对应的记录的微信id进行置空解绑操作;

至此,完成了对一个线上bug的处理;

总结:

对一个bug的处理首先需要定位其发生的大概范围,再试着重现该bug并分析与其相关的数据和代码逻辑,最终定位到bug出现的位置,并选择相应的方案进行处理;