【问题标题】:NO Guarantee of ACID for NOSql then how to ensure consistency?NOSql 的 ACID 没有保证,那么如何确保一致性?
【发布时间】:2015-11-25 09:57:52
【问题描述】:

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

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

【问题讨论】:

    标签: mongodb acid database nosql


    【解决方案1】:

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

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

    检测和处理编辑冲突的方法是为每篇文章添加一个修订 ID,每次编辑时将其递增一。更新文章时,使用更新而不是保存,如下所示:

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

    当有人同时编辑文章时,旧版本号的文章将不再在数据库中,您将获得writeResult.nModified == 0

    【讨论】:

    • 感谢您的回答。还有一个需要确认的问题是,即使没有副本集,MongoDB 的不一致是否仍然存在?因此,换句话说,我可以说revision-id方法总是必要的以确保一致性吗?
    猜你喜欢
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 2020-05-14
    相关资源
    最近更新 更多