gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:37:23 28 4
gpt4 key购买 nike

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

编辑:

情况是这样的:

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

  • 我可以用 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/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com