Dia 11 de 15

Transações e Concorrência

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

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

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.

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.