Транзакции Mongoose: выполняется только один запрос, другой игнорируется без ошибок - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь проверить очень простую транзакцию, включающую два обновления в одной коллекции.Идея состоит в том, что мне нужно, чтобы оба запроса потерпели неудачу, если один из них потерпит неудачу.Вот мой код:

      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 голосов
/ 22 февраля 2019

Как вы сказали, findAndAndUpdate не выдает, если не может найти документ для обновления.Это означает, что вы на самом деле не звоните session.abortTransaction();.Если вы выбрасываете, когда не можете найти документ для обновления, этот код должен начать работать так, как вы ожидаете.

Возможно, вы захотите написать свою собственную оболочку вокруг findOneAndUpdate Mongoose, чтобы проверить, является ли онуспешно обновил любые документы и выбросил, если нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...