首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB并发读写对

MongoDB并发读写对
EN

Stack Overflow用户
提问于 2020-06-07 23:27:06
回答 1查看 112关注 0票数 1

如何在MongoDB中处理并发?

考虑这样一种情况,我需要执行两次写入,这两种写入都是有效的,但我不能同时接受它们。如果这些写入同时发生,则后面的写入将不会知道前一个写入。

这里我模拟了这种情况(我使用mongoose):

代码语言:javascript
复制
const createNew = async () => {

    const session = await mongoose.startSession();
    session.startTransaction();

    const numberOfDocuments = await mongoose.model('User')
        .countDocuments()
        .session(session);

    if(numberOfDocuments > 0) return;    

    const newUser = new mongoose.model('User')();

    newUser.username = 'lol';
    newUser.email = 'lmao';

    await newUser.save(
        {
            session
        }
    );

    await session.commitTransaction();
    session.endSession();

};

createNew();
createNew();

该函数首先检查文档的数量,如果已经有一个文档,它应该停止。但是,因为它们“同时”执行,所以两次读取都将文档数量视为0,从而导致插入2个文档。

像这样的两个并发请求创建了读-读-写-写链,有没有一种方法来确保它是读-写-读-写的,这个问题有一个通用的名称吗?

EN

回答 1

Stack Overflow用户

发布于 2020-06-08 00:06:09

首先,当使用事务时,通常也必须在事务下进行读取,而不仅仅是写入。这是为了使读取的数据在发出写操作时不会被回滚。

对于您的特定示例,事务在操作(特别是atomicity and consistency)之上提供ACID属性。它们不是互斥的神奇解决方案。我认为事务不会像您试图做的那样帮助您限制集合大小的插入。

MongoDB不是分布式锁定系统。Here是一些软件的列表,这些软件是。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62247590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档