@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 모델 기반의 간단한 몇 가지 동작을 하나의 트랜잭션 안에 그룹핑 하는 예시입니다. 이를 통해 전체 트랜잭션이 성공적으로 완료되거나 실패할때 롤백되는 보장을 할 수 있습니다.