我正在尝试测试一个非常简单的事务,其中涉及同一集合上的两次更新。这个想法是,如果其中任何一个失败,我都需要两个查询都失败。这是我的代码:
const session = await mongoose.startSession();
session.startTransaction();
try {
const opts = { session, new: true };
const A = await Author.
findOneAndUpdate({firstName: 'Red'}, {firstName: 'Gray'}, opts);
const B = await Author.
findOneAndUpdate({firstName: 'Bill'}, {firstName: 'William'}, opts);
await session.commitTransaction();
session.endSession();
} catch (err) {
await session.abortTransaction();
session.endSession();
throw err;
}
因此,为了进行测试,我试图更改同一集合中两个单独文档中的firstName
字段。我故意在第一个findOneAndUpdate()
中提供了错误的条件(该集合没有Red
的任何文档,其值均为firstName
。)第二个条件是肯定的。但是,在执行第二个查询时,第一个没有执行。而猫鼬不会抛出错误,也不会发出警告。在这种情况下,我希望两者查询都失败,即事务中止。一个人怎么能做到?
答案 0 :(得分:1)
就像您说的那样,findAndAndUpdate
如果找不到要更新的文档,则不会抛出异常。这意味着您实际上并不是在呼叫session.abortTransaction();
。如果在找不到要更新的文档时抛出该代码,则该代码应按您期望的方式开始工作。
您可能想在Mongoose的findOneAndUpdate
周围编写自己的包装器,以检查它是否成功更新了任何文档,如果没有,则抛出。