2015-04-07 32 views
1

作为CouchDB或NoSQL的新手,通常我无法找到更新两个文档的好方法,但要保证两个文档都更新,或者两者都不更新。使用CouchDB交易式更新两个文档

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

我该如何确保在一些不幸的并发更新之后,我不会以两位或零位国王结束?

我正在考虑bulk update,但它不起作用,因为它不支持事务。

编辑:我见过问题Can I do transactions and locks in CouchDB?,但它没有解决我的情况。它也涉及到CouchDB中的事务,但这就是相似之处的结束。问题在于事务性地读取&更新一个文档,而我正在询问有关两个文档的事务性更新。我没有找到对我的案例有用的其他问题的答案,但如果您认为它是重复的,请解释原因。

+0

可能的重复:http://stackoverflow.com/questions/299723/can-i-do-transactions-and-locks-in-couchdb –

+0

@ChrisSnow - 感谢您的评论。我已经在打开这个之前阅读过你提到的问题。我只是没有找到适用于我的案例的解决方案。主要区别在于我想一次更新两个文档。 – TMG

+1

国家可以拥有其他文件,指向目前的国王,也许是一个国王的历史等,或者它可以被看作是一个事件,如KingElected和KingAbticated等文件... – Daniel

回答

1

事务性语义与批量更新

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

通过比较oldDoc._revnewDoc._rev处理修订验证在自己的validate_doc_update功能。

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

+0

这很有趣。我读了all_or_nothing,但引用之后的句子是:“在这种模式下,如果所有文档都通过验证,则所有文档都会更新,即使这会导致部分或全部文档发生冲突。”这阻碍了我探索它。我没有想到我可以使用您提出的验证来处理冲突管理。 – TMG

+0

与内置冲突管理相比,这种验证是否存在任何限制或副作用?国际海事组织编号: – TMG

+0

当内置jn修订处理模式未禁用时,您的定制修订处理将永远不会执行。即使它会 - 它只是应该沿着内置的等价物来实施。 –