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



我正试图从Mongo DB Node JS驱动程序(如上所述)在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"

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

脂肪信息:

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

  • 如果我删除了所有其他操作,只留下一个(不管是哪个),效果很好。

  • 如果我将操作的顺序(更改为任何顺序),则错误为
    添加第二个操作时仍然存在。

  • 如果所有操作都对同一个数据库和集合执行,则工作正常

我的代码:

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

你知道怎么解决这个问题吗?提前感谢!

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

不确定这是AWS上的实现问题还是的逐案错误配置问题

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

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

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

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

正如评论中所提到的,根据MongoDB团队的说法,这个问题已经在4.0.5 版本上得到了解决

我已经测试了发布在我的问题上的相同代码,现在它运行良好。

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

我也遇到了同样的问题。支持部门说,由于我在使用Mongoose,他们帮不上忙。然而,他们好心地给了我10美元的信用卡,这样我就可以在更高的级别上进行测试了。

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

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

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

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

第三步:你会看到一个蓝色的连接,注意留作默认。

  • 您将收到一个初始错误,因为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');
});

我遇到了一个类似的错误,我花了几个小时试图调试它。然后我删除了带有AWS的旧集群,并用谷歌云创建了一个新集群,它运行得很好。

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

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

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

按照以下步骤操作:

  1. 转到";https://www.mongodb.com/"和登录
  2. 点击";"网络接入";刚好低于";安全性";部分,位于屏幕左侧
  3. 点击";删除";您当前IP地址的按钮
  4. 然后,点击";添加IP地址";。在屏幕右侧。这将显示一个弹出框
  5. 点击";添加当前IP地址";并确认

我也遇到了同样的问题,在我的情况下,我已经使用了一个临时用户一周了,但我忘记了它。所以也许这对某人有帮助:)

最新更新