单节点CouchDB,多文档事务

时间:2016-12-26 23:28:37

标签: transactions couchdb acid document-database nosql

假设设计文档中有validate_doc_update函数,定义为:

{
   "_id": "_design/ddoc",
   "_rev": "12-133b5dad579f872884a9ccd6d4be5ee9",
   "language": "javascript",
   "validate_doc_update": "function(newDoc, oldDoc, userCtx) {
        if (oldDoc._rev != newDoc._rev) { throw('FAILED') }
   }"
}

如果我们执行批量更新(_bulk_docs);对于多个文档,它是跨国的吗?

注意:我找到this回答并阅读了文档并运行了一些测试代码。它似乎是在CouchDB上执行事务的完美方式!但是因为我没有在其他地方看过它(想知道为什么?);我想确保这不是一个错误。

2 个答案:

答案 0 :(得分:3)

CouchDB dev这里。

这是不是事务性的,它是设计的,即使在单个节点上也是如此。

原因是我们不希望CouchDB中的任何API在从单节点安装转移到集群安装时中断。

在集群中,保证多文档事务要困难得多,因此CouchDB甚至不会尝试它。

答案 1 :(得分:1)

我想补充一点,您通常可以将完整的交易存储到单个文档中,然后利用视图来显示结果。

例如,为了存储现金转账,而不是存储两个描述存款和提款的文件,而不是存储在"转移"键入文档,然后创建一个视图,返回每个帐户的余额。

或者以question you referred to为例:如果你想确保数据库中一次只有一个王,只需使用带有_id =' king'并存储有关国王的所有信息。如果国王改变,只需改变该文件中国王的实际数据。如果两个客户试图同时改变国王,你会发生冲突。顺便说一下,如果您使用多个节点或多个副本,例如通过PouchDB的离线优先客户端,这也会很有用。你最终必须考虑解决冲突,但按照设计,你永远不会遇到两个国王。

所以:根据您的需要,相应地为您的文档建模。如果您需要交易,请将每笔交易存储为单个文档。