使用mongodb在nodejs中使用锁定/事务读取和插入文档

Posted

技术标签:

【中文标题】使用mongodb在nodejs中使用锁定/事务读取和插入文档【英文标题】:Document Read and insert with locking/transaction in nodejs with mongodb 【发布时间】: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/… 【参考方案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 中查找读/写问题。

【讨论】:

以上是关于使用mongodb在nodejs中使用锁定/事务读取和插入文档的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB,网上没有关于事务和读操作交互的信息

MongoDB事务

SQLServer之创建事务未提交读

Mysql 锁定 读情况

mysql事务隔离级别的实现原理

IllegalOperation:尝试在 ubuntu 20.04 的只读目录 MongoDB 上创建锁定文件