我一直在使用Ektorp(1.3.0)框架连接到我的CouchDB数据库。
但是当出现更新冲突时会出现问题。
我使用方法executeAllOrNothing
进行批量更新。如文档所述,此方法(以及HTTP API等效_bulk_docs?all_or_nothing":true
)不会对冲突进行任何检查。来自HTTP API docs:
但是,如果ID为0的文档存在冲突,则两个版本都会发生冲突 存在于数据库中,随意选择哪个 出现在视图中。您可以使用GET来检查此状态 ?冲突=真
此外:
依赖此功能的应用程序应该能够 容忍一些文件丢失或处于冲突状态,直到 可以解决冲突。
然而,Ektorp的方法javadocs说:
列表(返回)仅包含具有从CouchDB返回的任何类型的错误代码的文档的条目。即如果一切顺利完成,列表将为空。
我发现事实并非如此。发生冲突时,Ektorp仍会返回一个空列表。我发现获取失败操作列表的唯一方法是使用executeBulk
而不是executeAllOrNothing
,但这并不令人满意,因为我需要将其作为交易。
有什么方法可以让我知道对executeAllOrNothing
的调用是否成功,如果没有,那么哪些文档存在冲突问题(不再重复使用GET with conflicts=true
作为我可能会一次尝试保存数千个文档,所以这是不切实际的)?
答案 0 :(得分:0)
您提到的ektorp doc中描述的行为不是CouchDB行为。使用all_or_nothing:true
CouchDB只会在数组中返回成功对象(ok
,id
和新rev
),而不会显示它们是否存在冲突。
因此,这种行为(从该数组中删除成功的对象)是ektorp必须(意味着)做的事情。所以这听起来像ektorp中的一个错误。您应该看到their github project有关如何举报错误的信息。