单节点 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 的离线优先客户端。您最终必须考虑解决冲突,但根据设计,您永远不会 运行 成为两个国王。
所以:根据您的需要,相应地为您的文档建模。如果您需要交易,请将每笔交易存储为单个文档。
假设有一个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 的离线优先客户端。您最终必须考虑解决冲突,但根据设计,您永远不会 运行 成为两个国王。
所以:根据您的需要,相应地为您的文档建模。如果您需要交易,请将每笔交易存储为单个文档。