作为 CouchDB 或 NoSQL 的新手,我通常找不到更新两个文档的好方法,并保证要么都更新,要么都不更新。
在我的用例中,每个文档中都有一个 bool 标志。为了说明这一点,我们假设我正在谈论带有 bool 属性 isKing 的 type="citizen"文档。我想确保一次只有一位国王。当我想更换国王时,事情就变得棘手了。这需要修改两个文件(为新国王设置isKing=true,为旧国王设置isKing=false)。
在一些不幸的并发更新之后,如何确保我不会最终得到两个或零个国王?
我在想bulk update ,但它没有帮助,因为它不支持事务。
编辑:我见过问题 Can I do transactions and locks in CouchDB? ,但它没有解决我的情况。它还与 CouchDB 中的事务相关,但相似之处仅此而已。问题在于以事务方式读取和更新一个文档,而我正在询问两个文档的事务更新。我发现其他问题的答案对我的案例没有帮助,但如果您认为它重复,请解释原因。
最佳答案
Transactional Semantics with Bulk Updates
In short, there are none (by design). However, you can ask CouchDB to check that all the documents in your _bulk_docs request pass all your validation functions. If even one fails, none of the documents are written. You can select this mode by including "all_or_nothing":true in your request.
通过比较 oldDoc._rev
和 newDoc._rev
,在自己的 validate_doc_update
函数中处理修订验证。
如果您让一个文档的验证失败 - 其他文档也不会被写入。
注意!!!答案仅对 CouchDB v1 有效。 CouchDB v2 忽略“all_or_nothing”属性。
关于transactions - 使用 CouchDB 对两个文档进行类似事务的更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29491618/