【问题标题】:MongoDB Atlas Error while performing transaction on multiple collections (code 8000)对多个集合执行事务时出现 MongoDB Atlas 错误(代码 8000)
【发布时间】:2019-04-14 16:50:44
【问题描述】:

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

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"

我已经搜索了一段时间,但找不到任何关于如何解决此问题的线索。

其他信息:

  • 将第二个操作添加到 交易。

  • 如果我删除所有其他操作并只留下一个(不
    不管哪个)它工作正常。

  • 如果我更改操作的顺序(任何顺序),错误是
    仍在添加第二个操作。

  • 如果操作都是对同一个db和collection执行的,它工作正常

我的代码:

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

关于如何解决这个问题的任何想法?提前致谢!

【问题讨论】:

  • " ... Atlas M0 实例 ..." - 你的意思是只有 一个 节点吗?我想“技术上”,即使只有一个节点,它仍应注册为副本集。可能取决于您实际连接到此的方式,并且示例代码中缺少您的连接字符串。如果您只是复制应该提供的字符串,那么它“应该”没问题。但我怀疑你省略了replicaSet 部分。
  • @NeilLunn 抱歉耽搁了。这是我的连接字符串:'mongodb+srv://:
  • @GCSDC 好吧,我制作了一张支持票。会让你知道结果如何。
  • @GCSDC 还没有。
  • @GCSDC 刚刚收到这封电子邮件:这是一个快速更新,让您知道在这种情况下报告的问题应该在 MongoDB 4.0.5 中得到解决,我们希望在 MongoDB Atlas 中提供该问题2019 年 1 月。我们将保持此票证处于等待开发状态,并在我们的共享层(M0、M2、M5)升级到 4.0.5 时提供进一步的更新。跨度>

标签: mongodb mongodb-atlas


【解决方案1】:

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

【讨论】:

  • 您能否发布您看到的错误,以便读者可以验证您是否有相同的错误消息?
  • 另外,你用的是什么版本?这似乎是早期版本的问题。
【解决方案2】:

我通过在 MongoDb 站点上使用图集创建数据库解决了这个问题。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我也遇到过类似的问题,请检查您的连接 URI。我的密码错误。

      【讨论】:

        【解决方案5】:

        我遇到了类似的错误,我花了几个小时尝试调试它。然后我删除了拥有 AWS 的旧集群并使用 Google Cloud 创建了一个新集群,它运行良好。

        【讨论】:

          【解决方案6】:

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

          • 当您拥有 Studio 3T 试用许可证界面时,请转到快速入门

          第 2 步:创建新连接。确保端口是localhost:27017 和数据库名称你的项目名称

          第3步:你会看到一个蓝色的连接,注意保持默认。

          • 您将收到初始错误,因为终端上未安装 DB。

          转到: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');
          });
          

          【讨论】:

          • 请适当地格式化您的帖子(文本和代码)
          • 谢谢下次会这样做
          【解决方案7】:

          我遇到了同样的问题。支持部门说,由于我使用的是 Mongoose,他们无法提供帮助。然而,他们很友好地给了我 10 美元的信用额度,这样我就可以用更高的等级来测试它。

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

          【讨论】:

            【解决方案8】:

            正如 cmets 中所述,根据 MongoDB 团队的说法,这个问题已在 4.0.5 版本中得到解决

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

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

            【讨论】:

            • 我在 mongodb Atlas Version 4.0.8 上仍然拥有它
            • @matcheek 我一直在使用我发布的代码,也是 4.0.8 版本,它工作正常。建议您仔细检查您的代码,如果仍然有问题,请向 mongodb 团队开票或在 SO 上提出新问题。
            【解决方案9】:

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

            不确定这是否是他们在 AWS 上实施的问题,还是逐个错误配置

            更新:同样的错误现在正在新集群上发生。我提出了一张票,得到了以下回复;

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

            他们说的和另一个答案一样。请使用 M10。然而,M10 的价格约为 60 美元/米,无论如何这都不是一个很好的解决方案。这也完全否定了他们说 M0 现在包括 MongoDb 4.0 的主要卖点

            【讨论】:

            • 谢谢迈克尔!您是否有票号或任何参考来跟踪问题?
            • 他们提到他们的内部开发队列是隐藏的,所以我认为你不会看到太多东西。个人支持票对公众不可见,因此我无法分享,但也没有太多相关信息。
            猜你喜欢
            • 2020-05-18
            • 2020-09-16
            • 1970-01-01
            • 2019-11-25
            • 1970-01-01
            • 2014-05-30
            • 2020-10-26
            • 2012-09-25
            • 1970-01-01
            相关资源
            最近更新 更多