代码
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 });