Olá, dev! Seja bem-vindo ao Dia 11 da sua preparação para a certificação MongoDB Associate Developer. Hoje estudaremos os mecanismos que garantem consistência, integridade e durabilidade de dados no MongoDB: o modelo de concorrência, o ciclo de transações ACID e as configurações de Write Concern e Read Concern.
1. Atomicidade no MongoDB
- Atomicidade em Nível de Documento Único (Single-Document Atomicity): Toda operação de modificação que atinge um único documento é atômica por padrão, mesmo se alterar múltiplos campos ou arrays embutidos complexos.
- Transações Multi-Documento (Multi-Document ACID Transactions): Para cenários que exigem modificar múltiplos documentos ou coleções de forma "tudo ou nada" (ex: transferência bancária entre duas contas), o MongoDB oferece suporte total a transações ACID.
2. Garantias de Escrita com `Write Concern`
O Write Concern define o nível de confirmação exigido do cluster antes que o MongoDB responda à aplicação informando sucesso na gravação.
// Exemplo de configuração de Write Concern
db.contas.insertOne(
{ clienteId: 101, saldo: 500 },
{ writeConcern: { w: "majority", j: true, wtimeout: 5000 } }
)
w: 1(Padrão): A gravação é confirmada assim que for processada pelo nó Primary.w: "majority": A gravação só é confirmada após ser gravada no nó Primary e replicada para a maioria calculada de nós votantes do Replica Set. Garante proteção contra perdas em caso de failover.j: true(Journal): Exige que os dados sejam gravados no arquivo de journal em disco antes de responder.wtimeout: Define um tempo limite em milissegundos para evitar que a aplicação fique bloqueada caso réplicas fiquem indisponíveis.
3. Nivéis de Isolamento de Leitura com `Read Concern`
O Read Concern controla o nível de consistência dos dados retornados pelas consultas de leitura.
"local"(Padrão no Primary): Retorna os dados mais recentes no nó consultado, mas sem garantia de que foram replicados para a maioria (pode sofrer rollback se o Primary cair)."majority": Retorna apenas dados que já foram gravados na maioria dos nós do Replica Set, garantindo que o dado lido nunca será revertido."linearizable": Garante consistência estrita lendo apenas do Primary e verificando em tempo real se ele ainda é o líder elegível."snapshot": Utilizado em transações multi-documento para fornecer uma visão ponto-no-tempo isolada e consistente.
4. Transações Multi-Documento no `mongosh`
// 1. Iniciar uma Sessão de Cliente
const session = db.getMongo().startSession();
// 2. Iniciar a Transação com Read/Write Concerns específicos
session.startTransaction({
readConcern: { level: "snapshot" },
writeConcern: { w: "majority" }
});
try {
const contasColl = session.getDatabase("banco").contas;
// Debitar da Conta A
contasColl.updateOne({ contaId: "A" }, { $inc: { saldo: -100 } });
// Creditar na Conta B
contasColl.updateOne({ contaId: "B" }, { $inc: { saldo: 100 } });
// 3. Confirmar a Transação
session.commitTransaction();
print("Transação realizada com sucesso!");
} catch (error) {
// 4. Abortar a Transação em caso de erro
session.abortTransaction();
print("Erro na transação, alterações revertidas:", error);
} finally {
session.endSession();
}
5. Questões no Estilo Exame de Certificação
Questão 1: Qual é o benefício do uso do `writeConcern: "majority"` em comparação com o padrão `writeConcern: 1`?
A) Aumenta a velocidade de gravação em 50%.
B) Impede que a gravação seja revertida (rollback) caso o nó Primary caia abruptamente logo após responder.
C) Permite gravar dados em coleções sem índice.
D) Executa a gravação em paralelo em todos os Shards do cluster.
Resposta Correta: B. O `w: "majority"` garante que a gravação foi persistida na maioria dos nós, de modo que uma nova eleição de Primary manterá esse dado seguro sem rollback.
Questão 2: Para garantir que uma consulta de leitura nunca retorne dados "sujos" (dirty reads) que poderiam ser revertidos por uma falha de réplica, qual `readConcern` deve ser configurado?
A) `"local"`
B) `"available"`
C) `"majority"`
D) `"uncommitted"`
Resposta Correta: C. O `readConcern: "majority"` garante que apenas dados gravados e confirmados pela maioria dos nós sejam lidos.