Что происходит, когда abortTransation() или endSession() не удается использовать mongoose?

У меня есть типичная операция транзакции с использованием mongoose в моем приложении nodeJS/Express:

let session = null;
try {
  session = await mongoose.startSession();
  await User.create({ ... });
  await Otp.create({ ... });
  await session.commitTransaction();
}
catch (error) {
  await session.abortTransaction();
}
finally {
  session.endSession();
}

Однако я узнал, что и abortTransaction(), и endSession() могут выдавать ошибки, поэтому мне интересно, что происходит, когда эти операции завершаются неудачно? Сможет ли мангуст сам навести порядок? Или мне нужно периодически повторять попытку прервать транзакцию/завершить сеанс, пока она не заработает, или какие-то другие странные вещи в этом роде? Кажется, я не могу найти никакой информации о том, как справиться с этим, поскольку в каждом учебнике, который я вижу, просто оставляйте код так, как я написал его в блоке кода выше, даже не заключая вызовы прерывания или завершения в их собственные попытки.

Выдает ошибку, потому что вы забыли начать транзакцию session.startTransaction(), session.withTransaction(), db.transaction() и т. д. Что касается беспорядка — mongo откатывает транзакцию, если вы ее успешно не зафиксировали. Мангуст (модели) – это совсем другая история. Model.create относительно безопасен — вы просто не используете объекты, созданные в рамках транзакции. Другие операции могут сохранить изменения в объектах, даже если model.save был отменен. Я бы предложил обернуть его тестами, чтобы убедиться, что он делает то, что вы хотите, в различных сценариях.

Alex Blex 09.07.2024 14:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я узнал, что и abortTransaction(), и endSession() могут выдавать ошибки, поэтому мне интересно, что происходит, когда эти операции завершаются неудачей?

abortTransaction() выдаст ошибку только тогда, когда вы попытаетесь прервать уже зафиксированную транзакцию или когда ни одна транзакция не активна. Обращайтесь

endSession() не выдаст никаких ошибок. Обращайтесь

abortTransaction() выдаст ошибку только в том случае, если ваш код будет таким.

try {
  session = await mongoose.startSession();
  //...
  await session.commitTransaction();
  await session.abortTransaction();
}
catch (error) {
  await session.abortTransaction();
}

Или:

try {
  session = await mongoose.startSession();
  //...
  await session.abortTransaction();
} catch (err) {
  console.info(err);
}

Ключевым моментом здесь является правильное использование.

может ли он не выдавать сетевые ошибки?

Oscar R 09.07.2024 16:24

@OscarR - Будет, но это не связано с транзакцией. Это должно обрабатываться промежуточным программным обеспечением обработки ошибок. Сетевая ошибка связана с MongoDB, а не конкретно с транзакцией. Сетевая ошибка возникнет при любой операции с БД. И если произойдет какая-либо ошибка, блок finally будет выполнен, а блок session завершится, и транзакция получит aborted.

Kabileesh G 10.07.2024 18:11

ок, спасибо за помощь!

Oscar R 10.07.2024 18:20

Другие вопросы по теме