我正在尝试从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;
}
}
}
关于如何解决此问题的任何想法?预先感谢!
答案 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
第2步:创建一个新连接。确保端口为localhost:27017
,并且将数据库命名为您的项目名称
第3步:您将看到一个蓝色的连接,请注意保留默认设置。
转到:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/
在macOS的终端项目文件夹中。
brew tap mongodb/brew
brew install mongodb-community@4.2
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 站点上创建一个带有图集的数据库解决了这个问题。