0

我一直在使用 Ektorp (1.3.0) 框架连接到我的 CouchDB 数据库。但是,当存在更新冲突时会出现问题。我正在使用 executeAllOrNothing批量更新的方法。如文档所述,此方法(以及等效的 HTTP API _bulk_docs?all_or_nothing":true不会对冲突进行任何检查。来自HTTP API 文档

但是,如果 id 为 0 的文档发生冲突,则两个版本都将出现在数据库中,并且可以任意选择哪个版本出现在视图中。您可以使用带有 ?conflicts=true 的 GET 检查此状态

还:

依赖此功能的应用程序应该能够容忍某些文档丢失或处于冲突状态,直到发生冲突解决。

但是,该方法的 Ektorp 的 javadocs 说:

该列表(返回)将仅包含具有从 CouchDB 返回的任何类型的错误代码的文档的条目。即如果一切都成功完成,列表将为空。

我发现事实并非如此。当发生冲突时,Ektorp 仍然返回一个空列表。我发现获取失败操作列表的唯一方法是使用executeBulk而不是executeAllOrNothing,但这并不令人满意,因为我需要这是一个事务。

有什么方法可以知道调用是否executeAllOrNothing成功,如果没有成功,哪些文档有冲突问题(无需重复使用GET with conflicts=true每个文档,因为我可能会尝试一次保存数千个文档,所以这个不切实际)?

4

1 回答 1

0

您提到的 ektorp 文档中描述的行为不是 CouchDB 行为。使用all_or_nothing:trueCouchDB 时,只需在数组中返回成功对象(okidnew rev),根本没有任何迹象表明它们存在冲突。

因此,这种行为(从该数组中删除成功的对象)是 ektorp 必须(应该)做的事情。所以这听起来像是 ektorp 中的一个错误。您应该查看他们的 github 项目以了解如何报告错误。

于 2012-06-27T23:09:51.327 回答