假设设计文档中有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上执行事务的完美方式!但是因为我没有在其他地方看过它(想知道为什么?);我想确保这不是一个错误。
答案 0 :(得分:3)
CouchDB dev这里。
这是不是事务性的,它是设计的,即使在单个节点上也是如此。
原因是我们不希望CouchDB中的任何API在从单节点安装转移到集群安装时中断。
在集群中,保证多文档事务要困难得多,因此CouchDB甚至不会尝试它。
答案 1 :(得分:1)
我想补充一点,您通常可以将完整的交易存储到单个文档中,然后利用视图来显示结果。
例如,为了存储现金转账,而不是存储两个描述存款和提款的文件,而不是存储在"转移"键入文档,然后创建一个视图,返回每个帐户的余额。
或者以question you referred to为例:如果你想确保数据库中一次只有一个王,只需使用带有_id =' king'并存储有关国王的所有信息。如果国王改变,只需改变该文件中国王的实际数据。如果两个客户试图同时改变国王,你会发生冲突。顺便说一下,如果您使用多个节点或多个副本,例如通过PouchDB的离线优先客户端,这也会很有用。你最终必须考虑解决冲突,但按照设计,你永远不会遇到两个国王。
所以:根据您的需要,相应地为您的文档建模。如果您需要交易,请将每笔交易存储为单个文档。