NO Guarantee of ACID for NOSql 那么如何保证一致性呢?

NO Guarantee of ACID for NOSql then how to ensure consistency?

例如,要在 MongoDB 中查找并保存文档:

Article article1 = mongoOperation.findOne(new Query(Criteria.where("_id").is(1)), Article.class);
mongoOperation.save(article.setAttrA("A"));
Article article2 = mongoOperation.findOne(new Query(Criteria.where("_id").is(1)), Article.class);
mongoOperation.save(article.setAttrB("B"));

默认_id为主键,所以article1和article2的文档是一样的

是否可以获得 article2 的过时文档,其中 attrA 尚未设置为 A,因为理论上 MongoDB 不遵循 ACID 属性。

是的,在应用保存之前,第二个查询可能 return 相同的文档。

如果您使用的是异步 API、具有不安全写入问题的同步 API 或具有更喜欢副本集的次要读取偏好(通常缺少几秒钟)。

检测和处理编辑冲突的方法是为每篇文章添加修订 ID,每次编辑时该 ID 递增 1。当你更新一篇文章时,你使用更新而不是保存,就像这样:

article.revision++;
writeResult = db.articles.update(
    { _id: article._id, revision: article.revision -1 }, 
    article, 
    { writeConcern: WriteConcern.ReplicaAcknowledged}
);

当有人在此期间编辑文章时,具有旧修订 ID 的文章将不再存在于数据库中,您将得到 writeResult.nModified == 0