2019.07.05

今天在查看日志的时候发现了一个问题,报error级别的主键冲突, 大致原因是因为一个询价单可能有多个店铺多个商品,而我们一个订单中只能有一个店铺,所以说一个询价单可能对应多个订单,代码如下:

if (oi.getInquiryId() != null && StringUtils.isNoneBlank(oi.getInquiryId())) {
OfbizInquiryHeader ih = inquiryHeaderMapper.selectByPrimaryKey(oi.getInquiryId());
if (ih == null) {
try {
ih = new OfbizInquiryHeader();
ih.setCarBrandId(oi.getCarBrandId());
ih.setCarBrandName(oi.getCarBrandName());
ih.setCarVin(oi.getVin());
ih.setInquiryId(oi.getInquiryId());
ih.setLicensePlate(oi.getLicensePlate());
inquiryHeaderMapper.insert(ih);
} catch (Exception e) {
log.error("保存订单询价单信息失败", e);
}
}
}

也就是说,在插入inquiry_header这张表的时候,先查一个是否存在,不存在的话才插入,那么可能会产生什么问题呢?
因为我们是微服务集群,可能节点1和节点2同时运行到了查询的那条语句,查询出来的结果都是没有对应的记录,这个时候节点1先插入完成,节点2再进行插入的时候就报主键冲突的错.
那么怎么解决呢?要解决的话也不难,可以加分布式锁,但是我认为没有必要,因为加锁会导致速度变慢,而inquiry_header对我们来说也并不是一张主表,算是很边缘的一张表.
我认为只需要catch住主键冲突这个异常,不打印日志或者打印一个warn级别的日志就可以了,其他的错误依旧catch住,打印error级别的日志.
怎么解决还是得看业务的需求和性价比,单纯的为了炫技而炫技没有意思.

posted @ 2019-07-05 10:32  天糊十三幺  阅读(117)  评论(0)    收藏  举报