一、插入操作引发的并发问题实录
问题代码
Query q=new Query(Criteria.where("groupId").is(groupId));
Update upd = new Update();
upd.set("updateTime",System.currentTimeMillis());
YtoGroupDocEntity modRm = mongoTemplate.findAndModify(q, upd, YtoGroupDocEntity.class);
if (modRm==null) {
mongoTemplate.insert(ytoGroupDocEntity);
}
修改后的代码
YtoGroupDocEntity modRm = mongoTemplate.findAndModify(q, upd, YtoGroupDocEntity.class);
if (modRm==null) {
mongoTemplate.upsert(q, upd, YtoGroupDocEntity.class);
}
分析:
问题代码:
当A B两个请求insert groupId数据
正常情况是A insert一条数据以后B findAndModify
现在A B请求同时进来会导致A未insert之前B已经findAndModify然后B也会执行insert操作 导致数据重复
修改后代码
修改成upsert以后即使出现上面情况因为MongoDB自身的锁机制几乎不会出现问题