情况
代码如下:
MyLog myLog = mongoTemplate.find(new Query(Criteria.where("code").is("1234")))
myLog.setRequestDate(new Date());
mongoTemplate.save(myLog);
详细报错如下:
exception ERROR org.springframework.dao.OptimisticLockingFailureException: Optimistic lock exception on saving entity
原因
save具有update的效果,但是如果实体启用了versionEntity功能, 更新数据时要求version大于库中的version。
但是直接提取出来的数据 有可能 别人也在并发修改,导致 我们 存库时的version小于 库中的version。
详情可参考 Mongo DB乐观锁之version在spring data中应用
解决方案
手动处理version号再使用save
if(myLog.getVersion()!=null) {
myLog.setVersion(myLog.getVersion()+1);
}
不使用save,使用update
Update update=new Update();
update.set("requestDate", new Date());
dpUserMongoTemplate.updateFirst(new Query(Criteria.where("code").is(1234)),update , MyLog.class);
不使用save,使用insert
MyLog myLog = mongoTemplate.find(new Query(Criteria.where("code").is("1234")))
myLog.setRequestDate(new Date());
mongoTemplate.insert(myLog);
需要注意的是 insert 方式 如果库中已经有 _id相同的数据 会报错,所以需要我们清楚执行操作的目的是 在原数据上更新,还是多一条记录入库。 |