database - 我可以在 CouchDB 中进行事务和锁定吗?

标签 database couchdb nosql

我需要做事务(开始、提交或回滚)、锁定(选择更新)。
如何在文档模型数据库中执行此操作?

编辑:

情况是这样的:

  • 我想经营一个拍卖网站。
  • 我也想如何直接购买。
  • 在直接购买中,我必须减少项目记录中的数量字段,但前提是数量大于零。这就是为什么我需要锁和事务。
  • 我不知道如何在没有锁和/或事务的情况下解决这个问题。

  • 我可以用 CouchDB 解决这个问题吗?

    最佳答案

    不。CouchDB 使用“乐观并发”模型。用最简单的术语来说,这只是意味着您随更新一起发送文档版本,如果当前文档版本与您发送的版本不匹配,CouchDB 将拒绝更改。

    这看似简单,真的。您可以为 CouchDB 重构许多基于普通事务的场景。不过,在学习 CouchDB 时,您确实需要抛开 RDBMS 领域知识。从更高的层次解决问题是有帮助的,而不是试图将 Couch 塑造成基于 SQL 的世界。

    跟踪库存

    您概述的问题主要是库存问题。如果您有一个描述项目的文档,并且它包含一个“可用数量”字段,您可以像这样处理并发问题:

  • 检索文档,记下 _rev CouchDB 发送的属性
  • 减少数量字段,如果它大于零
  • 使用 _rev 发回更新的文档属性(property)
  • 如果_rev匹配当前存储的号码,大功告成!
  • 如果存在冲突(当 _rev 不匹配时),检索最新的文档版本

  • 在这种情况下,有两种可能的故障场景需要考虑。如果最新的文档版本的数量为 0,您可以像在 RDBMS 中一样处理它,并提醒用户他们实际上无法购买他们想要购买的东西。如果最新的文档版本的数量大于 0,您只需使用更新的数据重复该操作,然后从头开始。这迫使您比 RDBMS 做更多的工作,并且如果频繁出现冲突的更新可能会有点烦人。

    现在,我刚刚给出的答案假设您将在 CouchDB 中以与在 RDBMS 中的方式大致相同的方式进行操作。我可能会以不同的方式处理这个问题:

    我将从包含所有描述符数据(名称、图片、描述、价格等)的“主产品”文档开始。然后我会为每个特定实例添加一个“库存单”文档,字段为 product_keyclaimed_by .如果您正在销售锤子模型,并且有 20 个要出售,那么您可能会拥有带有 hammer-1 之类的 key 的文档。 , hammer-2等,代表每个可用的锤子。

    然后,我将创建一个 View ,该 View 为我提供可用锤子的列表,并带有一个可让我查看“总数”的 reduce 函数。这些完全是袖手旁观,但应该让您了解工作 View 的样子。

    map
    function(doc) 
    { 
        if (doc.type == 'inventory_ticket' && doc.claimed_by == null ) { 
            emit(doc.product_key, { 'inventory_ticket' :doc.id, '_rev' : doc._rev }); 
        } 
    }
    

    这给了我一个可用的“票”列表,按产品 key 。当有人想买锤子时,我可以捕获其中的一组,然后迭代发送更新(使用 id_rev ),直到我成功申领一个(之前申领的门票将导致更新错误)。

    减少
    function (keys, values, combine) {
        return values.length;
    }
    

    这个reduce函数简单地返回无人认领的总数inventory_ticket项目,因此您可以知道有多少“锤子”可供购买。

    注意事项

    这个解决方案代表了对您提出的特定问题的大约 3.5 分钟的总思考时间。可能有更好的方法来做到这一点!也就是说,它确实大大减少了冲突更新,并减少了用新更新来响应冲突的需要。在此模型下,您不会有多个用户尝试更改主要产品条目中的数据。在最糟糕的情况下,您将有多个用户尝试索取一张票,如果您从 View 中捕获了其中的几个,您只需转到下一张票并重试。

    引用:https://wiki.apache.org/couchdb/Frequently_asked_questions#How_do_I_use_transactions_with_CouchDB.3F

    关于database - 我可以在 CouchDB 中进行事务和锁定吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/299723/

    相关文章:

    database - 使 SQL Server 数据库脱机时等待时间过长

    Javascript 函数返回 session 对象

    javascript - mongodb 在简单的查找查询中返回数组大小/计数,而不使用聚合框架

    node.js - DocumentDB 中的分页

    mysql - 使用 MySQL 与 NoSQL 的单个服务器上的 Key-Value 数据库是否存在高性能差异

    mysql - 我将如何设计这个 MySQL 模式?

    ios - 正确处理Realm对象删除

    mysql 数据库设计用于跟踪用户是否看过某个项目

    couchdb - 从文档中获取单个值

    javascript - 如何干燥我的 CouchDB View ?