如何在不使用复制的情况下模拟CouchDB中的冲突?

时间:2011-09-29 19:47:30

标签: couchdb conflict

我想为我的应用编写单元测试,模拟复制过程中的冲突。有没有办法只使用一个CouchDB数据库和服务器来模拟冲突?

3 个答案:

答案 0 :(得分:5)

我假设您想要在数据库中获取包含冲突的文档,而不是409冲突响应?

因此,使用已知的_id:

在数据库中创建文档
$ curl http://localhost:5984/scratch/foo -X PUT -H "Content-Type: application/json" -d '{}'
{"ok":true,"id":"foo","rev":"1-967a00dff5e02add41819138abb3284d"}

然后使用批量文档API和all_or_nothing:true选项来更新同一个文档,故意为坏或没有_rev,添加一些不同的文档属性以便进行测量:

$ curl http://localhost:5984/scratch/_bulk_docs -X POST -H "Content-Type: application/json" -d '{"all_or_nothing": true, "docs": [{"_id": "foo", "abc": 123}]}'
[{"id":"foo","rev":"1-15c813a2b4b312c6915821b01a1986c5"}]

然后您应该在文档中发生冲突:

$ curl http://localhost:5984/scratch/foo?conflicts=true
{"_id":"foo","_rev":"1-967a00dff5e02add41819138abb3284d","_conflicts":["1-15c813a2b4b312c6915821b01a1986c5"]}

您还可以使用?new_edits=false described by CouchDB committer Randall Leeds执行常规查询。

$ curl http://localhost:5984/scratch?new_edits=false -X POST -H "Content-Type: application/json" -d '{"_id": "foo", "abc": 123}'

答案 1 :(得分:1)

在提出问题后进一步搜索,看起来答案是使用批量文档API的all-or-nothing模式。

http://wiki.apache.org/couchdb/HTTP_Bulk_Document_API

看看页面的末尾。

答案 2 :(得分:0)

只需发布具有相同_id属性的两个文档。这会产生冲突,因为第二个doc将不包含正确的_rev属性。请记住,您需要在每个后续帖子中包含最新的_rev属性,以便CouchDB知道您是最新的。

此外,您可以在同一台服务器上创建两个数据库,并在这些数据库之间进行复制。

相关问题