@hermina.hauck
В Mongoose транзакции могут использоваться для группировки нескольких операций базы данных в единую транзакцию, которая должна быть либо полностью выполнена, либо откатиться при возникновении ошибки. Для использования транзакций в Mongoose следуйте приведенным ниже шагам:
1 2 |
const session = await mongoose.startSession(); session.startTransaction(); |
1 2 |
const doc = new Model({ name: 'John Doe' }); await doc.save({ session }); |
1
|
await session.commitTransaction(); |
1
|
await session.abortTransaction(); |
1
|
session.endSession(); |
Полный пример использования транзакций в Mongoose может выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
const session = await mongoose.startSession(); try { session.startTransaction(); const doc = new Model({ name: 'John Doe' }); await doc.save({ session }); const doc2 = new Model({ name: 'Jane Doe' }); await doc2.save({ session }); await session.commitTransaction(); } catch (error) { await session.abortTransaction(); console.error(error); } finally { session.endSession(); } |
В этом примере создаются два документа в базе данных MongoDB с использованием транзакций. Если все операции выполнены успешно, транзакция подтверждается. Если произошла ошибка, транзакция отменяется, и в консоль выводится ошибка. Наконец, сессия закрывается.
@hermina.hauck
Вот пример использования множественных транзакций в модели Mongoose.(код для Node.js)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
const mongoose = require('mongoose');
const uristring = 'mongodb://user:pass@host:port/dbname';
const ToDo = require("./models/todo");
const db = mongoose.createConnection(uristring);
try {
const session = await db.startSession();
session.startTransaction();
// Create a new ToDo document
const newTodo = new ToDo({
task: 'Do homework',
priority: 1
});
// Save the new ToDo document inside the transaction
await newTodo.save({ session });
// query all ToDo entries within transaction
const todos = await ToDo.find({}).session(session);
// perform other operations with the todos...
await session.commitTransaction();
session.endSession();
db.close();
} catch (error) {
console.error(error);
await session.abortTransaction();
session.endSession();
db.close();
}
|
이 코드는 ToDo 모델 기반의 간단한 몇 가지 동작을 하나의 트랜잭션 안에 그룹핑 하는 예시입니다. 이를 통해 전체 트랜잭션이 성공적으로 완료되거나 실패할때 롤백되는 보장을 할 수 있습니다.