MongoDB Atlas Ошибка при выполнении транзакции в нескольких коллекциях (код 8000) - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь выполнить транзакцию для экземпляра Mongo DB Atlas M0 из драйвера JS узла Mongo DB (как описано здесь ), и получаю следующую ошибку:

code:8000
codeName:"AtlasError"
errmsg:"internal atlas error checking things: Failure getting dbStats: read tcp 192.168.254.78:50064->192.168.254.78:27000: i/o timeout"
message:"internal atlas error checking things: Failure getting dbStats: read tcp 192.168.254.78:50064->192.168.254.78:27000: i/o timeout"
name:"MongoError"

Я уже некоторое время ищу и не могу найти подсказки, как решить эту проблему.

Дополнительная информация:

  • Ошибка добавляется после добавления второй операции к сделка.

  • Если я удалю все остальные операции и оставлю только одну (не
    независимо от того, что) он отлично работает.

  • Если я изменю порядок операций (на любой порядок), ошибка будет
    еще при добавлении второй операции.

  • Если все операции выполняются с одной и той же БД и коллекцией, она работает нормально

Мой код:

async function connect () {

if (dbClient !== null && dbClient.isConnected()) {
    console.log('Reusing db connection => ' + JSON.stringify(dbClient));
  } else {
      console.log('Connecting to database');
      dbClient = await MongoClient.connect(url, { useNewUrlParser: true });
      console.log('Successfully connected to database');
  }
}

async function insertDocuments(document1, document2, document3) {

  try {
    await connect();
  } catch (error) {
    throw error
  }

  let session = dbClient.startSession();

  session.startTransaction({
    readConcern: { level: 'snapshot' },
    writeConcern: { w: 'majority' }
  });

  const collection1 = dbClient.db('mydbname').collection('collection1');
  const collection2 = dbClient.db('mydbname').collection('collection2');
  const collection3 = dbClient.db('mydbname').collection('collection3');
  const logsCollection = dbClient.db('mydbname').collection('logs');

  await collection1.replaceOne(
    { _id: document1._id },
    document1,
    {
      upsert: true,
      session
    }
  );
  await collection2.replaceOne(
    { _id: document2._id },
    document2,
    {
      upsert: true,
      session
    }
  );
  await collection3.replaceOne(
    { _id: document3._id },
    document3,
    {
      upsert: true,
      session
    }
  );
  await logsCollection.updateOne(
    { _id: document1._id },
    { $unset: { estoque: '' } },
    { session }
  );

  try {
    await commitWithRetry(session);
  } catch (error) {
    await session.abortTransaction();
    throw error;
  }
}

async function commitWithRetry(session) {
  try {
    await session.commitTransaction();
    console.log('Transação gravada com sucesso');
  } catch (error) {
    if (
      error.errorLabels &&
      error.errorLabels.indexOf('UnknownTransactionCommitResult') >= 0
    ) {
      console.log('Transação não realizada, tentando novamente ...');
      await commitWithRetry(session);
    } else {
      console.log('Erro ao gravar no banco de dados ...');
      throw error;
    }
  }
}

Есть идеи, как это исправить? Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

У меня была такая же проблема, и я не мог ее решить. В итоге я создал новый кластер в Azure (вместо AWS), и, похоже, он работает нормально.

Не уверен, является ли это проблемой с их реализацией в AWS или в случае индивидуальной неправильной конфигурации

Обновление : та же ошибка теперь происходит в новом кластере. Я поднял билет и получил следующий ответ:

Эта ошибка в настоящее время затрагивает свободный кластер M0 и общие уровни Atlas (M2 и M5). Мы открыли внутренний отчет об ошибке, чтобы решить эту проблему. Хотя внутренняя очередь разработки для наших облачных продуктов не является общедоступной, мы отслеживаем работу, необходимую для работы многодокументных транзакций на свободных кластерах уровня Atlas.

Они сказали то же самое, что и другой ответ. Пожалуйста, используйте M10. Тем не менее, M10 составляет около $ 60 / м, что не является каким-либо разрешением. Это также полностью аннулирует основную точку их продажи, говоря, что M0 теперь включает MongoDb 4.0

0 голосов
/ 09 января 2019

Как уже упоминалось в комментариях, по мнению команды MongoDB, эта проблема была решена в версии 4.0.5

Я протестировал тот же код, размещенный на мой вопрос, и теперь он работает нормально.

Для тех, кто сталкивается с той же проблемой, обязательно используйте версию, равную или выше 4.0.5.

0 голосов
/ 20 ноября 2018

У меня была такая же проблема. Отдел поддержки сказал, что, так как я использовал Mongoose, они не могли помочь. Однако, они были достаточно любезны, чтобы дать мне 10 $ в кредит, чтобы я мог проверить это с более высоким уровнем.

В этом была проблема, как только я перешел на уровень M10 (следующий после M0), транзакции начали работать как задумано. Ваш код очень похож на мой, только я создавал один документ и обновлял 2 других одновременно. Как и в вашем случае, первый прошел (независимо от порядка), а следующий - просто по тайм-ауту с той же ошибкой.

...