不保证NOSql的ACID然后如何确保一致性?

时间:2015-11-25 09:57:53

标签: mongodb acid database nosql

例如,在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的文档是相同的。

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

1 个答案:

答案 0 :(得分:2)

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

实际上,如果您使用的是异步API,具有不安全写入问题的同步API,或者读取首选项更喜欢副本集(通常缺少几秒钟),那么这很可能。< / p>

您可以执行的检测和处理编辑冲突的方法是在每篇文章中为每篇文章添加一个修订版ID。更新文章时,使用update而不是save,如下所示:

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

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