作为CouchDB或NoSQL的新手,我找不到更新两个文档的好方法,保证两者都更新或者都不更新。
在我的用例中,每个文档中都有一个布尔标志。为了说明,我们假设我正在讨论type =“citizen”的文档,其布尔属性为isKing。我想确保一次只有一个国王。当我想改变国王时,它变得棘手。这需要修改两个文件(为新的国王设置isKing = true,为旧的设置为isKing = false)。
在一些不幸的并发更新后,我如何确保我不会得到两个或零个国王?
我在考虑bulk update,但由于它不支持交易,因此无效。
编辑:我见过问题Can I do transactions and locks in CouchDB?,但它没有解决我的问题。它还涉及CouchDB中的事务,但这就是相似之处的结束。问题在于交易阅读&更新一个文档,而我问的是两个文档的事务更新。我没有找到对我的案例有帮助的其他问题的答案,但如果你认为它是重复的,请解释原因。
答案 0 :(得分:2)
批量更新的交易语义
简而言之,没有(按设计)。但是,您可以要求CouchDB检查_bulk_docs请求中的所有文档是否都通过了所有验证功能。即使一个失败,也不会写入任何文件。您可以通过在请求中包含“all_or_nothing”:true来选择此模式。
通过比较validate_doc_update
和oldDoc._rev
,在自己的newDoc._rev
函数中处理修订验证。
如果你让一个文件的验证失败 - 另一个也不会写。
<强>注意!!!答案仅适用于CouchDB v1。 CouchDB v2忽略了“all_or_nothing”属性。