背景:员工在开单时,会创建进行中服务(ins)记录,同时员工的轮牌(rotate)表会记录 ins_id,表示某员工服务这一单。
问题:员工轮牌(rotate)状态是服务中,但是查不到进行中服务的单据。
bug调查发现是换技师的操作导致该问题。
定位过程:
-
利用闪回查询数据库历史数据,发现员工 轮牌 rotate 表 中的 insId 字段记录了进行中服务的 id, 但是进行中服务记录已经被删除了(ins记录删除会移动到 ins_finish 表),
-
查看 ins 记录删除时间,为 当天的 20:30
-
由于换技师会发推送,查看推送历史:
-
发现在20:24:38秒的时候,有不同的操作人同时操作了换技师的操作,怀疑是这里出现并发问题。
-
自己模拟bug复现场景,没能复现bug
-
查看代码换技师逻辑:发现主要分为两步:1. 旧轮牌 insId 改成0 ,2. 新轮牌0改成insId。
-
bug 推断:
18 号技师换 5 号技师,步骤1完成;
18号技师换66号技师,步骤1完成
18 号技师换 5 号技师,步骤2完成,5号技师记录了insId;
18 号技师换 66 号技师,步骤2完成,66号技师记录了insId;
5号技师退钟,ins记录被删除;
66号的轮牌记录了insId, 但是 ins 记录已经被删除了,就会导致这个bug。 -
查看代码,发现同事的 version 版本控制存在问题,只做了校验,没有 version +1。
至此,bug完整的查找过程已经结束。
bug虽然很简单,但是项目比较复杂,排查过程中走了许多弯路,这里简单记录下思路:
根据问题数据查找 bug 复现时间;
根据推送记录或者 log 日志查看用户在此具体做了什么操作;
尝试复现 bug;
查看代码逻辑,分析可能的问题。