Возможна ли одна транзакция для нескольких соединений в mongodb? - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь реализовать одну транзакцию для подключения к нескольким базам данных в mongodb.Но он застрял в startSession ().У меня есть два дБ (набор реплик) и два подключения для каждого.

var express = require('express');
var router = express.Router();
const mongoose = require('mongoose');

//set replica set
const options = { replicaSet: 'replocal', useNewUrlParser: true, };

// create connection from diffrent db
var conn = mongoose.createConnection('mongodb://localhost:27017/db1', options);
var conn2 = mongoose.createConnection('mongodb://localhost:27017/db2', options);

// create account in diffent db
const AccountFromdb1 = conn.model('AccountFromdb1', new mongoose.Schema({ name: String, balance: Number }));
const AccountFromdb2 = conn2.model('AccountFromdb2', new mongoose.Schema({ name: String, balance: Number }));

/* transaction test */
router.get('/transaction', async function (req, res, next) {


  // Insert accounts and transfer some money
  await AccountFromdb1.create({ name: 'A', balance: 5 });
  await AccountFromdb2.create({ name: 'B', balance: 10 });

  //start session
  const session = await mongoose.startSession(); // <--- stuck here
  session.startTransaction();

  try {

    const opts = { session, new: true };

    const A = await AccountFromdb1.
      findOneAndUpdate({ name: 'A' }, { $inc: { balance: -5 } }, opts);

    if (A.balance < 0) {
      throw new Error('Insufficient funds: ' + (A.balance + 5));
    }

    await AccountFromdb2.
      findOneAndUpdate({ name: 'B' }, { $inc: { balance: 5 } }, opts);

    await session.commitTransaction();
    session.endSession();
    next();

  } catch (error) {
    // If an error occurred, abort the whole transaction.
    await session.abortTransaction();
    session.endSession();
    throw error;
  }

});

module.exports = router;

В дополнение к транзакциям формы документа MongoDB:

Вы можете указать чтение / запись (CRUD)операции с существующими коллекциями.Коллекции могут находиться в разных базах данных ref

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...