Как использовать транзакции в Mongoose?

Пользователь

от hermina.hauck , в категории: JavaScript , 2 года назад

Как использовать транзакции в Mongoose?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от rudolph_senger , 2 года назад

@hermina.hauck 

В Mongoose транзакции могут использоваться для группировки нескольких операций базы данных в единую транзакцию, которая должна быть либо полностью выполнена, либо откатиться при возникновении ошибки. Для использования транзакций в Mongoose следуйте приведенным ниже шагам:

  1. Начните транзакцию с помощью метода startSession() и передайте ему объект опций.
1
2
const session = await mongoose.startSession();
session.startTransaction();


  1. Выполните операции базы данных внутри транзакции. Например, создайте новый документ:
1
2
const doc = new Model({ name: 'John Doe' });
await doc.save({ session });


  1. Если все операции прошли успешно, подтвердите транзакцию с помощью метода commitTransaction():
1
await session.commitTransaction();


  1. Если при выполнении операций произошла ошибка, отмените транзакцию с помощью метода abortTransaction():
1
await session.abortTransaction();


  1. Наконец, закройте сессию с помощью метода endSession():
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 с использованием транзакций. Если все операции выполнены успешно, транзакция подтверждается. Если произошла ошибка, транзакция отменяется, и в консоль выводится ошибка. Наконец, сессия закрывается.

Пользователь

от francis_schuster , 7 месяцев назад

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