【问题标题】:Document Read and insert with locking/transaction in nodejs with mongodb使用mongodb在nodejs中使用锁定/事务读取和插入文档
【发布时间】:2021-11-13 03:34:55
【问题描述】:

在预订系统中,只有 5 个不同的用户可以创建预订。如果 100 个用户同时调用预订 api,而不是如何处理并发锁定。我正在将nodejs与mongodb一起使用。我在 mongodb 中查看了 mongo 并发 article 和事务,但找不到任何带锁定的示例编码解决方案。

我已经通过乐观并发控制实现了解决方案(当资源争用较少时 - 这可以使用 versionNumber 或 timeStamp 字段轻松实现)。

提前感谢您建议我使用锁定解决方案。

现在算法是:

第 1 步:从 userSettings 集合中获取 userAllowedNumber。

//Query
db.getCollection('userSettings').find({})

//Response Data
{ "userAllowedNumber": 5 }

第 2 步,从预订集合中获取当前的bookedCount。

//Query
db.getCollection('bookings').count({ })

//Response Data
2

第 3 步,如果 bookedCount <= userAllowedNumber 则插入预订。

//Query
db.getCollection('bookings').create({ user_id: "usr_1" })

【问题讨论】:

  • 没有回复意味着Mongodb不处理这种情况......是吗?
  • MongoDB 自 4.0 起支持多文档 ACID 事务,这是此处解释的用例的解决方案。在此处查看 Lauren 的 NodeJS 博客文章:mongodb.com/blog/post/…。或者使用涵盖类似用例的 Java 进行挖掘:“不要卖得比库存多”:mongodb.com/blog/post/…

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

我在 mongodb 社区中对事务锁定进行了深入讨论。在结论中,我学习并发现了事务的局限性。我们无法使用锁来处理此任务的并发请求。

您可以在此链接中查看完整的 Mongodb 社区对话 https://www.mongodb.com/community/forums/t/implementing-locking-in-transaction-for-read-and-write/127845

带有 Jmeter 测试的 Github 演示代码显示了限制并且无法处理此任务的并发请求。 https://github.com/naisargparmar/concurrencyMongo

新的建议仍然欢迎和赞赏

【讨论】:

    【解决方案2】:

    举个简单的例子,首先你需要让一个客户端连接到一个 MongoDB。

    const client = new MongoClient(uri);
    await client.connect();
    

    一旦你有了客户端,你就可以创建一个会话来进行交易

    const session = await client.startSession();
    const transactionResults = await session.withTransaction( async () => {
         await client.db().collection("example").insertOne(example);
    }, transactionOptions);
    

    transactionOptions 是:

    const transactionOptions = {
       readPreference: 'primary',
       readConcern: { level: 'majority' },
       writeConcern: { w: 'majority' }
    };
    

    在 MongoDb documentation 中查找读/写问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 2017-03-02
      • 2022-10-06
      • 1970-01-01
      • 2013-11-11
      相关资源
      最近更新 更多