使用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中使用锁定/事务读取和插入文档的主要内容,如果未能解决你的问题,请参考以下文章