单节点 CouchDB,多文档事务

Single Node CouchDB, Multi Doc Transaction

假设有一个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 上执行事务的完美方式!但是因为我没有在其他地方看到它(并且想知道为什么?);想确认一下,这不是一个错误。

这里是 CouchDB 开发人员。

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

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

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

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

例如,要存储现金转账,不要存储描述存款和取款的两个文档,而是将两者都存储在 "transfer" 类型的文档中,然后创建一个返回每个帐户余额的视图。

还是拿question you referred to中的例子来说:如果要保证数据库中一次只有一个king,只需要使用_id = 'king'的文档并存储那里有关于国王的所有信息。如果国王发生变化,只需更改该文件中国王的实际数据即可。如果两个客户同时尝试更换国王,您就会发生冲突。顺便说一句,如果您使用多个节点或多个副本,这也很有效,例如通过 PouchDB 的离线优先客户端。您最终必须考虑解决冲突,但根据设计,您永远不会 运行 成为两个国王。

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