首页 > 解决方案 > ArangoDB 为同一文档返回不同的修订版本

问题描述

对于某些人,我们观察到 ArangoDB 与 _rev 值不一致。一次又一次地发生一个文档存在两个修订版。当我们通过 API 查询文档并按属性过滤时,我们不会返回最后的状态。例子:

  1. for t in Thing filter t.urn = 'urn:dev:123456'//返回错误的版本
  2. for t in Thing filter t._id = "Thing/678465"//返回正确的版本

当我们使用 ArangoDB 前端时也会发生同样的情况。ArangoDB 是单个实例,不是集群的。更新事物的服务是集群的。因此可能会发生“并行”访问。

过去我们有 write-write-log 异常,所以我们使用 ArangoDBAsync 客户端。

事物更新生成如下:

BaseDocument baseDocument = new BaseDocument(); updateJson.getProperties().forEach(baseDocument::addAttribute); thingCollectionAsync.updateDocument(thingKey, baseDocument, new DocumentUpdateOptions().mergeObjects(true));

在 baseDocument 中没有设置 _id、_key 或 _rev 属性。

但是,修订错误只是偶尔发生,不能直接重现。

通过以下查询,我们可以检测到此错误:

for t in thing
let tById  = (for t2 in thing filter t2._id == t._id return t2)
let tByUrn = (for t3 in thing filter t3.urn == t.urn return t3)
filter t._rev != tById[0]._rev || t._rev != tByUrn[0]._rev
return t

这怎么可能发生?

我们使用 Java API,最新版本 ArangoDB 版本:3.8.0

标签: arangodb

解决方案


推荐阅读