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
。
例如,要在 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
。