猫鼬交易:仅执行一个查询,另一个查询无错误

时间:2019-02-22 11:16:24

标签: mongodb mongoose transactions

我正在尝试测试一个非常简单的事务,其中涉及同一集合上的两次更新。这个想法是,如果其中任何一个失败,我都需要两个查询都失败。这是我的代码:

      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。)第二个条件是肯定的。但是,在执行第二个查询时,第一个没有执行。而猫鼬不会抛出错误,也不会发出警告。在这种情况下,我希望两者查询都失败,即事务中止。一个人怎么能做到?

1 个答案:

答案 0 :(得分:1)

就像您说的那样,findAndAndUpdate如果找不到要更新的文档,则不会抛出异常。这意味着您实际上并不是在呼叫session.abortTransaction();。如果在找不到要更新的文档时抛出该代码,则该代码应按您期望的方式开始工作。

您可能想在Mongoose的findOneAndUpdate周围编写自己的包装器,以检查它是否成功更新了任何文档,如果没有,则抛出。