场景:注册企业信息的时候根据企业的统一社会信用代码去查询数据库是否存在该企业,如果存在则更新,如果不存在则新增
问题:如果多线程同时调用接口,会导致新增多条相同数据
CompanyInfoTemp companyInfoTemp1 = getListBuUniscId(uniscId);
if(companyInfoTemp1==null){
baseMapper.insert(companyInfoTemp);
}else{
companyInfoTemp.setCompanyId(companyInfoTemp1.getCompanyId());
baseMapper.updateById(companyInfoTemp);
}
期望结果:多线程调用时也只新增一条数据,其他为更新
已尝试过为该方法添加synchronized锁,可以实现,但效率会降低,期望得到一个其他方法
1.统一社会信用代码设置为唯一键
2.不做判断直接insert
3.尝试捕获唯一键异常,如果是统一社会信用代码的唯一键冲突就执行更新
疑问:
为啥已经存在的该企业,该企业还需要注册企业信息?
接口这里如果不加锁,那就在数据库层面写个存储过程
总之,既然你并行的两个请求可能互相冲突,那就必须让它们变成串行的
你要是为了效率不顾错误,也可以并行往里面塞,然后每天定时启动个服务把所有多的删掉,根据时间保留新的删除旧的