【问题标题】:Single Node CouchDB, Multi Doc Transaction单节点 CouchDB,多文档事务
【发布时间】:2017-05-11 06:34:35
【问题描述】:

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

【问题讨论】:

    标签: transactions couchdb acid document-database nosql


    【解决方案1】:

    这里是 CouchDB 开发人员。

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-10-25
        • 1970-01-01
        • 2018-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-21
        • 2012-01-05
        相关资源
        最近更新 更多