如何在MongoDB中处理并发?
考虑这样一种情况,我需要执行两次写入,这两种写入都是有效的,但我不能同时接受它们。如果这些写入同时发生,则后面的写入将不会知道前一个写入。
这里我模拟了这种情况(我使用mongoose):
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个文档。
像这样的两个并发请求创建了读-读-写-写链,有没有一种方法来确保它是读-写-读-写的,这个问题有一个通用的名称吗?
发布于 2020-06-08 00:06:09
首先,当使用事务时,通常也必须在事务下进行读取,而不仅仅是写入。这是为了使读取的数据在发出写操作时不会被回滚。
对于您的特定示例,事务在操作(特别是atomicity and consistency)之上提供ACID属性。它们不是互斥的神奇解决方案。我认为事务不会像您试图做的那样帮助您限制集合大小的插入。
MongoDB不是分布式锁定系统。Here是一些软件的列表,这些软件是。
https://stackoverflow.com/questions/62247590
复制相似问题