问题描述:3个线程同时执行相同的一个mysql事务:先查询第三方数据,在事务中查询本地数据库是否存在数据,有就更新,没有就新增
结果:本地数据库中的数据出现一次重复,之后定时执行的时候也没有更多的数据重新
初步分析:是有一个线程查询本地数据库的时候没有查询到数据,判断为数据库中不存在数据,将已经存在的数据又新增了一遍,导致的数据重复
//查询已存在的数据进行对比更新
List<TblThirdPartyDepart> departs = tblThirdPartyDepartService.list(Wrappers.lambdaQuery(TblThirdPartyDepart.class).eq(TblThirdPartyDepart::getEquipmentId, equipmentInfo.getId()));
Map<String, TblThirdPartyDepart> departMap = departs.stream().collect(Collectors.toMap(TblThirdPartyDepart::getResCode, Function.identity()));
//查询vm平台组织 更新组织数据
for (TblThirdPartyDepart thirdPartyDepart : orgList) {
if (departMap.containsKey(thirdPartyDepart.getResCode())) {
TblThirdPartyDepart depart = departMap.get(thirdPartyDepart.getResCode());
thirdPartyDepart.setId(depart.getId());
tblThirdPartyDepartService.updateById(thirdPartyDepart);
departMap.remove(thirdPartyDepart.getResCode());
} else {
tblThirdPartyDepartService.save(thirdPartyDepart);
}
}
//同步删除组织
if (CollectionUtil.isNotEmpty(departMap.values())) {
List<Long> longList = departMap.values().stream().map(TblThirdPartyDepart::getId).collect(Collectors.toList());
tblThirdPartyDepartService.removeByIds(longList);
}