mogoose事务不适用于MongoDB



代码

router.get("/", async (req, res) => {
const sesion = await mongoose.startSession();
try {
sesion.startTransaction();
const blog = new Blog({ title: "blog title" });
const byte = new Dsabytes({ topStory: "Not an ObjectId" });
await blog.save();
await byte.save(); // throw an error, because topStory should be an ObjectId
await sesion.commitTransaction();
sesion.endSession();
res.send("OK");
} catch (e) {
console.log(e);
await sesion.abortTransaction();
sesion.endSession();
res.status(500).send(e.toString());
}
});

在Dsabytes模式中,我将topStory定义为ObjectId。当我用topStory:"6167213f5003f3d062dd833f"运行上面的代码时,它运行得很好。

但是,当await byte.save()抛出错误时,理想情况下sesion.abortTransaction()应该删除由blog.save()引起的更新。

API调用前的数据库

博客

[]

Dsabytes

[]

API调用后的DB

博客

[
{
title:"blog title"
}
]

Dsabytes

[]

那么,当它抛出错误时,两个集合最后都应该是空的?

我认为您必须通过保存的会话

类似的东西

await blog.save({ session });
await byte.save({ session });

相关内容

最新更新