【发布时间】: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