使用CouchDB对两个文档进行类似事务的更新

时间:2015-04-07 12:29:08

标签: transactions couchdb nosql

作为CouchDB或NoSQL的新手,我找不到更新两个文档的好方法,保证两者都更新或者都不更新。

在我的用例中,每个文档中都有一个布尔标志。为了说明,我们假设我正在讨论type =“citizen”的文档,其布尔属性为isKing。我想确保一次只有一个国王。当我想改变国王时,它变得棘手。这需要修改两个文件(为新的国王设置isKing = true,为旧的设置为isKing = false)。

在一些不幸的并发更新后,我如何确保我不会得到两个或零个国王?

我在考虑bulk update,但由于它不支持交易,因此无效。

编辑:我见过问题Can I do transactions and locks in CouchDB?,但它没有解决我的问题。它还涉及CouchDB中的事务,但这就是相似之处的结束。问题在于交易阅读&更新一个文档,而我问的是两个文档的事务更新。我没有找到对我的案例有帮助的其他问题的答案,但如果你认为它是重复的,请解释原因。

1 个答案:

答案 0 :(得分:2)

  

批量更新的交易语义

     

简而言之,没有(按设计)。但是,您可以要求CouchDB检查_bulk_docs请求中的所有文档是否都通过了所有验证功能。即使一个失败,也不会写入任何文件。您可以通过在请求中包含“all_or_nothing”:true来选择此模式。

通过比较validate_doc_updateoldDoc._rev,在自己的newDoc._rev函数中处理修订验证。

如果你让一个文件的验证失败 - 另一个也不会写。

<强>注意!!!答案仅适用于CouchDB v1。 CouchDB v2忽略了“all_or_nothing”属性。