一次bug的处理过程-OA重复档案的问题

1、有的用户无法新增,昨天已经提交该问题,需尽快处理,目前有人入职但是无法使用OA;

2、有的用户新增后,出现了如下的情况,同一个用户出现两条记录(具体如下图),造成该用户无法登陆;但是生成了该员工的档案,但是查看详情时,却又无法看到数据,都是空档案;

  这些问题的出现跟最近新上线的功能即新建系统用户直接创建空档案功能有关(仅包括工号、用户名、姓名以及自动创建标识)。

  对于问题1,我们直接远程调试到生产系统,代码如下:

UserEntity userEntity = userService.queryUserByStaffId(staffinfoEntity.getStaffId());
		if (userEntity != null) {
			boolean isOk = userService.updateUserInfoforDefine4(userEntity.getUserCode(), "updateNofiles");
			if(isOk) {
				code = staffinfoDao.add(staffinfoEntity);
			}
			try {
				moduleProxyService.updateUserAndLdapAdByStaffInfo(staffinfoEntity);
			} catch (Exception e) {
				throw new StaffInfoException("新增档案失败" + e.getMessage());
			}
		} else {
			code = staffinfoDao.add(staffinfoEntity);
		}

  在第一行查询时,user只有一个。然后我们进到updateUserAndLdapAdByStaffinfo方法中,该方法第一行即为根据工号查询用户。此时系统则报出错误。我们使用mybatis的selectOne,但是结果集却为两个。我们开始查询user表发现并不存在对应新增staffid的用户,因为事务在此处并未提交,这是没有问题的。但事务并未提交,在前一句还查的是一条,为什么在这里就变成了两条。在这两句中间只有一句话,那就是插入了一条档案数据。那就是在事务中档案及用户数据都应该是一条。

  我们打开对应queryUserByStaffId的方法,如下:

<!-- 按员工工号查询  -->
	<select id="queryUserByStaffId"	resultMap="UserResultMap"  parameterType="String">
		SELECT 
		<include refid="UserAll_column"/>, User.userStatus
		FROM 
		<include refid="User_Staff_View"/> 
		User  
		WHERE User.staffId = #{staffid}
	</select>
	<sql id = "User_Staff_View">
		(SELECT tsu.id,tsu.sortNo,tsu.userCode,tsu.deptCode,tsu.deptName,tsu.userName,tsu.userNamePinying,tsu.sex,tsu.userNameEn,tsu.aliasName,tsu.`password`,tsu.dn,tsu.managementScopeType,tsu.managementScope,
		tsu.accessControl,tsu.createTime,tsu.createUserCode,tsu.bindingIp,tsu.modifyTime,tsu.modifyUserCode,tsu.define1,tsu.define2,tsu.define3,tsu.active,tsu.staffId,tsu.deskMenuSequence,tsu.userStatus,
		tsu.givenName,tsu.sn,tsu.displayname,
		tps.personalEmail AS email,
		tps.phone AS mobile,
		tps.stationNo AS physicalDeliveryOfficeName,
		tps.extensionPhone AS telephoneNumber,
		tps.officeAddress AS l,
		tps.postName AS title,
		tps.directLeaderName AS manager,
		tps.define4 AS define4
 		FROM t_sys_user tsu INNER JOIN t_per_staffinfo tps ON tsu.staffId = tps.staffId)
	</sql>	

  这种查询用户的方法源于我们之前的一次优化过程。因为用户和档案信息中存在部分字段重复,我们将user表中与档案信息存在重复的一些字段进行了整理,统一关联到档案表中。因为user表中有一些字段被删除,而在业务中可能又需要这些字段,所以我们加了如User_Staff_View的查询方式。

  负责的工程师首先认为是inner join导致的这个问题,导致出现两条。我马上予以了否认,如果user\staffinfo各只有一条数据,使用inner join不会产生两条查询结果。工程师修改为left join得到的结果也是一样。

  同时,其他的问题不断爆出,出现了问题2,错误原因了也是登陆成功后查询用户信息,因selectOne报出500错误。我在系统中查询同一工号或用户名确实是两条相同的用户信息。于是我问运维同事什么情况下会插入两条相同用户信息。随后在后台数据中我又发现用户记录却只有一条,为什么查询却会出现两条呢?

  问题逐渐聚焦在查询方法上。这个关联查询出现问题可以肯定的是不是用户信息有多条,就是档案信息有多个。但从业务角度讲,用户和档案相对于staffid都是全局唯一的。我查询了档案数据,发现档案果然就是两条——HR在使用OA为新入职员工创建档案使用的是excel导入的追加功能(导入有追加和更新两种,如果选择追加,则不做判断,直接插入新记录),而新上线的功能又会在创建用户时同步创建一个空档案,从而产生两条档案记录,也影响到了用户的查询。

  再回到第一个问题,我们知道,新增用户时在新增用户未完成之前,新增档案动作还没有执行。这时候不仅用户,档案也只是一条未提交事务记录,不可能存在多条。我们进一步确认,发现我们新增用户的那个工号已经在用户表中存在,这个工号曾经被分配给一个放弃入职的新员工,放弃入职后IT并未将其删除,所以在新建用户后,未提交事务中的记录+已存在的记录恰是两条。这个问题的错误导向也直接影响了我们对问题2的分析和判断。

  下面我们看一下inner join\left join\right join三者的区别:三者的定义我们大家都知道,inner join只查出符合条件的记录,left join以左表为基准,right join以右表为基准。我们看看我们这种情况,使用三种join的查询结果,经过测试,都是两条。其实这也是我马上对工程师的判断予以否认的原因。

时间: 2024-10-08 11:36:34

一次bug的处理过程-OA重复档案的问题的相关文章

一个疑难bug的解决过程

一个crontab脚本,下载一个文件并把内容入mysql数据库.具体流程如下: 1, wget一个文件. 2,处理文件生成一个中间文件. 3,将中间文件load入库. 05 10 * * * /home/work/local/php5.4/bin/php /home/work/www/new_products1/web/index_cli.php actionads/index bug现象: 在线上,5次运行中,有2次会出错,就是入库的数据会缺失30%以上. 在线上手动运行脚本,没有一次出错.但

Markdown使用时的一个BUG的发现过程

前言 遇到bug应该只要提交给官方就好了.但是我正好在学习Web前端,遇到了问题就正好运用新学的知识试着自己处理一下.恰好我又刚好运用新学的知识找到了问题,于是就记录一下自己遇到问题和解决的过程. 问题1-部分内容丢失 写了大段的文章,并且也成功保存到草稿了.但是之后打开的时候发现后半部分都没有了,并且页面显示也有问题.显示的样子是这样的: 再次打开保存的草稿后,一部分内容会跑到文本框外面去,如上面最后一行的样子.然后这部分在文本框外面的内容就丢失了.当时只是看到了这个情况,但是并没有什么想法.

记录一个前端bug的解决过程

人在江湖飘,哪能不挨刀. 我挨了重重一bug.严格来讲这可能是我职业生涯以来的首个悲惨经历,因为凭我的知识储备和经验,基本上任何可重现的bug都是可解的.然而这个bug却困扰了我三个月之久,它具有以下生理特征: 后台日志能统计到异常,偶发.低频 报异常的用户设备不具有规律性,什么手机都有 我们自己无法复现,任何设备.任何环境都没复现 打电话回访报异常的用户,确实存在问题 客服未接到用户主动反馈这个异常 此bug并不是js报错,而是一个业务逻辑的错误.表现是,用户提交的数据莫名缺失.场景是以下这个

有bug的随机生成不重复1-9的代码

#include "pch.h" #include "stdio.h" #include "stdlib.h" #include "time.h" int m[9] = {0}; int main(void) { srand(time(0)); for (int i = 1; i < 10; i++) { m[i - 1] = rand()%9+1; for (int j = 0; j < i - 1; j++)

记一次Bug定位的过程

问题1 工作需要出bug的芯片不详细说明,该芯片的CPU含有32个中断源,一般来说,以stm32为例,中断向量表定义在startup_stm32f40_41xxx.s中,写为: ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY EXPORT __Vectors EXPORT __Vectors_End EXPORT __Vectors_Size __Vectors DCD __initial_sp ; T

记一个bug的排查过程---复盘

公众号做了新需求:菜单的click事件,支持多条客服消息. 上线后,只有一个功能不好使,是点击菜单,预期发一条文本类型的客服消息. 实际操作时,点这个菜单项后,什么也没有发生. elk上看日志,也没有什么报错.也不应该有报错,如果后端服务异常,公众号上会提示,“服务不可用”如果在后台打开 菜单管理 页面,什么也不做,再点个 保存 ,菜单 的功能就恢复正常了. ====================================================================

解Bug之路-记一次中间件导致的慢SQL排查过程

解Bug之路-记一次中间件导致的慢SQL排查过程 前言 最近发现线上出现一个奇葩的问题,这问题让笔者定位了好长时间,期间排查问题的过程还是挺有意思的,正好博客也好久不更新了,就以此为素材写出了本篇文章. Bug现场 我们的分库分表中间件在经过一年的沉淀之后,已经到了比较稳定的阶段.而且经过线上压测的检验,单台每秒能够执行1.7W条sql.但线上情况还是有出乎我们意料的情况.有一个业务线反映,每天有几条sql有长达十几秒的超时.而且sql是主键更新或主键查询,更奇怪的是出现超时的是不同的sql,似

ASP.NET Web Form和MVC中防止F5刷新引起的重复提交问题

转载  http://www.cnblogs.com/hiteddy/archive/2012/03/29/Prevent_Resubmit_When_Refresh_Reload_In_ASP_NET_Web_Form_MVC.html 什么是刷新/重新载入 IE中的刷新(Refresh),在FF和Chrome中称为重新载入(Reload),与正常进入页面的区别在于以下两点: 1. 缓存控制 如果文件(比如图片)在本地缓存中已经存在,正常进入页面会不访问服务器而直接从本地加载.而对于刷新操作,

一次排查页面重复请求的经历

前段时间重构一个页面,页面中存在通过第三方JavaScript代码插入的动态广告(正常的产品需求),上线后发现第三方的广告资源存在重复请求的问题.由于控制广告插入的JavaScript代码由第三方提供,我们只负责按照他们要求的方式引入即可,所以对JavaScript代码内容并不了解,在这种情况下开始了艰难的排查过程.虽困难重重,但最终还是找到了原因,在此过程中有些收获,现将排查过程抽象如下: 注:以下过程和截图皆在Chrome浏览器中进行. 一.代码 <div id="container&