【问题标题】:Mongoose transactions: Only one query executing, the other being ignored without error猫鼬事务:只执行一个查询,另一个被忽略而没有错误
【发布时间】:2019-02-22 23:01:56
【问题描述】:

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

      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)。第二个条件是肯定的。但是,当第二个查询执行时,第一个查询没有。 mongoose 不会抛出错误,也不会发出警告。在这种情况下,我希望 both 查询失败,即交易被中止。怎么可能做到这一点?

【问题讨论】:

    标签: mongodb mongoose transactions


    【解决方案1】:

    就像你说的,findAndAndUpdate 在找不到要更新的文档时不会抛出异常。这意味着您实际上并没有打电话给session.abortTransaction();。如果您在找不到要更新的文档时抛出异常,那么该代码应该会按照您期望的方式开始工作。

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

    【讨论】:

      猜你喜欢
      • 2017-05-08
      • 2020-01-14
      • 2020-04-16
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 2018-06-15
      相关资源
      最近更新 更多