У меня есть типичная операция транзакции с использованием 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()
могут выдавать ошибки, поэтому мне интересно, что происходит, когда эти операции завершаются неудачно? Сможет ли мангуст сам навести порядок? Или мне нужно периодически повторять попытку прервать транзакцию/завершить сеанс, пока она не заработает, или какие-то другие странные вещи в этом роде? Кажется, я не могу найти никакой информации о том, как справиться с этим, поскольку в каждом учебнике, который я вижу, просто оставляйте код так, как я написал его в блоке кода выше, даже не заключая вызовы прерывания или завершения в их собственные попытки.
Я узнал, что и
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);
}
Ключевым моментом здесь является правильное использование.
может ли он не выдавать сетевые ошибки?
@OscarR - Будет, но это не связано с транзакцией. Это должно обрабатываться промежуточным программным обеспечением обработки ошибок. Сетевая ошибка связана с MongoDB, а не конкретно с транзакцией. Сетевая ошибка возникнет при любой операции с БД. И если произойдет какая-либо ошибка, блок finally
будет выполнен, а блок session
завершится, и транзакция получит aborted
.
ок, спасибо за помощь!
Выдает ошибку, потому что вы забыли начать транзакцию
session.startTransaction()
,session.withTransaction()
,db.transaction()
и т. д. Что касается беспорядка — mongo откатывает транзакцию, если вы ее успешно не зафиксировали. Мангуст (модели) – это совсем другая история.Model.create
относительно безопасен — вы просто не используете объекты, созданные в рамках транзакции. Другие операции могут сохранить изменения в объектах, даже еслиmodel.save
был отменен. Я бы предложил обернуть его тестами, чтобы убедиться, что он делает то, что вы хотите, в различных сценариях.