在多个集合上执行事务(代码8000)时,MongoDB Atlas错误

时间:2018-11-11 23:09:25

标签: mongodb mongodb-atlas

我正在尝试从Mongo DB Node JS驱动程序在Mongo DB Atlas M0实例上执行事务(如here所述),并且出现以下错误:

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;
    }
  }
}

关于如何解决此问题的任何想法?预先感谢!

9 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,无法解决。我最终在Azure(而不是AWS)上创建了一个新群集,它似乎运行良好。

不确定这是由于其在AWS上的实施还是个案配置错误引起的

更新:新群集上现在发生了相同的错误。我举了票,得到了以下答复;

  

已确定这是当前影响M0免费集群和Atlas共享层(M2和M5)的错误。我们已经打开了一个内部错误报告以解决此问题。虽然我们的Cloud产品的内部开发队列不公开,但我们正在跟踪使多文档事务在Atlas免费层集群上工作所需的工作。

他们说的与其他答案相同。请使用M10。但是,M10约为$ 60 / m,无论如何都不算​​是一个分辨率。这也完全使他们的主要卖点无效,因为他们说M0现在包括MongoDb 4.0

答案 1 :(得分:2)

正如评论中提到的那样,根据MongoDB团队的说法,此问题已在4.0.5版中解决

我已经测试过与问题相同的代码,现在可以正常工作了。

对于面临相同问题的任何人,请确保使用等于或高于4.0.5的版本。

答案 2 :(得分:1)

我遇到了同样的问题。支持并不是特别有用,因为他们说,由于我正在使用猫鼬,他们无法帮助我。但是,他们足够友善地赠送我10美元的信用额,因此我可以在更高层次上进行测试。

这就是问题,一旦我升级到M10层(M0之后的下一个),事务就会按预期开始工作。您的代码与我的代码非常相似,只是我创建了一个文档并同时更新了另外两个文档。就像您的情况一样,第一个经历了(无论顺序如何),第二个经历了相同的错误。

希望它会有所帮助:)

答案 3 :(得分:1)

我通过转到mongo db Cloub中的数据库中的网络访问解决了这个问题,并删除了旧的IP地址并通过单击添加IP地址并选择了这个当前的ID地址来放置一个新的IP地址

答案 4 :(得分:0)

第1步下载https://robomongo.org/download

  • 拥有Studio 3T试用版许可证界面后,请转到“快速入门”

第2步:创建一个新连接。确保端口为localhost:27017,并且将数据库命名为您的项目名称

第3步:您将看到一个蓝色的连接,请注意保留默认设置。

  • 由于终端上未安装数据库,您将收到一个初始错误。

转到:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/

在macOS的终端项目文件夹中。

  1. brew tap mongodb/brew
  2. brew install mongodb-community@4.2
  3. mongo。 如果得到==> Successfully started `mongodb-community` (label: homebrew.mxcl.mongodb-community),则希望终端上没有错误。

最后一步:返回界面并单击蓝色按钮,DB将自动连接。

// .env file on project root folder
MONGO_URI='mongodb://localhost:27017/projectname'

下面的连接代码:

const express = require('express');
const mongoose = require('mongoose');

require('dotenv').config();

const app = express();

mongoose
  .connect(process.env.MONGO_URI, { useNewUrlParser: true })
  .then(() => console.log('DB Connected'));

mongoose.connection.on('error', (err) => {
  console.log(`DB connection error: ${err.message}`);
});

app.get('/', (req, res) => {
  res.send('hello from the other side');
});

答案 5 :(得分:0)

我遇到了类似的错误,并且花了数小时尝试对其进行调试。然后,我删除了具有AWS的旧群集,并使用Google Cloud创建了一个新群集,一切正常。

答案 6 :(得分:0)

我遇到了类似的问题,只需检查您的连接 URI。我的密码错误。

答案 7 :(得分:0)

我也遇到过这种类型的错误。作为结论,请设置您的集群密码,不要使用“@/#”等特殊字符。或使用自动生成的密码。它对我有用

答案 8 :(得分:0)

我通过在 MongoDb 站点上创建一个带有图集的数据库解决了这个问题。