MongoDB Atlas Error ao executar transações em várias coleções (código 8000)
Estou tentando executar uma transação em uma instância do Mongo DB Atlas M0 a partir do driver JS do Mongo DB Node JS (conforme descritoAqu) e estou recebendo o seguinte erro:
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"
Estou pesquisando há um tempo e não consigo encontrar nenhuma pista sobre como resolver isso.
Informações adicionais:
O erro é gerado após adicionar a segunda operação à transaçã
Se eu remover todas as outras operações e deixar apenas uma (não
matter) que funciona be
Se eu alterar a ordem das operações (para qualquer ordem), o erro será
ainda adicionando a segunda operaçã
Se todas as operações forem executadas no mesmo banco de dados e coleção, funcionará bem
Meu código:
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;
}
}
}
Alguma ideia de como consertar isso? Desde já, obrigado