arangodb - ArangoDB 为同一文档返回不同的修订版本
问题描述
对于某些人,我们观察到 ArangoDB 与 _rev 值不一致。一次又一次地发生一个文档存在两个修订版。当我们通过 API 查询文档并按属性过滤时,我们不会返回最后的状态。例子:
for t in Thing filter t.urn = 'urn:dev:123456'
//返回错误的版本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
解决方案
推荐阅读
- ios - OHHTTPStubs 单元测试实现
- javascript - Javascript-JQuery | 如何解析 HTML 文本区域并从文本框中输入值?
- swift - 获取当前 Firebase 云消息传递注册令牌错误
- c - 如果声明了 int A[5] 那么只有 A 是指向 A[0] 的指针。这意味着 A 只是一个指针。那么 sizeof(A) 怎么会给出 20 的答案
- dart - 飞镖转换地图
- c# - Optano.Modeling 不适用于 MipCL
- javascript - 将 jQuery 对象复制到模态,然后隐藏或显示,然后显示
- javascript - react / redux无法读取未定义的属性'setCurrent'
- python - Python 的 zip 与矩阵转置有根本的不同吗?
- angular - Angular 5 - 获取数据异步