【发布时间】:2020-06-07 15:27:06
【问题描述】:
如何在 MongoDB 中处理并发?
考虑我需要执行 2 次写入的情况,它们本身都是有效的,但我不能同时接受它们。 如果这样的写入同时发生,后面的写入将不会知道前面的写入。
这里我模拟了情况(我使用猫鼬):
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 个文档。
像这样的两个并发请求创建读-读-写-写链,有没有办法确保它是读-写-读-写,并且这个问题有一个通用名称吗?
【问题讨论】:
标签: mongodb concurrency transactions acid