Что происходит, когда 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() могут выдавать ошибки, поэтому мне интересно, что происходит, когда эти операции завершаются неудачно? Сможет ли мангуст сам навести порядок? Или мне нужно периодически повторять попытку прервать транзакцию/завершить сеанс, пока она не заработает, или какие-то другие странные вещи в этом роде? Кажется, я не могу найти никакой информации о том, как справиться с этим, поскольку в каждом учебнике, который я вижу, просто оставляйте код так, как я написал его в блоке кода выше, даже не заключая вызовы прерывания или завершения в их собственные попытки.

🤔 А знаете ли вы, что...
Node.js позволяет создавать веб-приложения в реальном времени с помощью библиотеки Socket.io.


51
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);
}

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