Transações no MongoDB: Controle de Escrita, Leitura e Operações Multidocumento

Operações de Escrita

writeConcern - Parâmetro w

O writeConcern determina quantos nós devem confirmar uma operação de escrita para que seja considerada bem-sucedida. Os valores possíveis são:

  • 0: A operação é enviada sem aguardar confirmação
  • n (1 ≤ n ≤ número máximo de nós): A escrita deve replicar para n nós
  • majority: A operação deve replicar para a maioria dos nós do cluster

O thread que inicia a operação bloqueia até que o número especificado de nós confirme a escrita. Em um replicaset de três nós, o padrão é w:1 (apenas o primário). Para dados críticos, use w:majority; para dados comuns, w:1.

db.colecao.insert(
  {valor: 10}, 
  {writeConcern: {w: 3, wtimeout: 5000}}
)

Parâmetro journal

Controla quando uma operação de escrita é considerada persistida:

  • true: A escrita deve ser gravada no arquivo journal
  • false: Considera sucesso quando a escrita chega à memória

Operações de Leitura

As leituras envolvem duas decisões principais:

  • De onde ler? - readPreference
  • Quais dados podem ser lidos? - readConcern

readPreference

Define a preferência de origem dos dados:

  • primary: Ler apenas do nó primário
  • primaryPreferred: Preferência pelo primário
  • secondary: Ler apenas de nós secundários
  • secondaryPreferred: Preferência por secundários
  • nearest: Seleciona o nó com menor latência
db.colecao.find({campo: "valor"}).readPref("secondary")

Tags

Em clusters com múltiplos nós, é possível usar tags para direcionar operações específicas. Por exemplo, nós com hardware superior podem receber a tag "producao" enquanto nós de análise recebem "relatorios".

readConcern

Define quais dados estão disponíveis para leitura em um nó:

  • available: Todos os dados disponíveis
  • local: Dados disponíveis no fragmento atual
  • majority: Dados confirmados pela maioria dos nós
  • linearizable: Garante leitura linearizável
  • snapshot: Lê do snapshot mais recente

Leitura Segura com Replicação

Combinação de readConcern e writeConcern para operações seguras:

Exemplo inseguro:

db.pedidos.insert({id: 200, produto: "bola", quantidade: 2})
db.pedidos.find({id: 200}).readPref("secondary")

Exemplo seguro:

db.pedidos.insert(
  {id: 200, produto: "bola", quantidade: 2},
  {writeConcern: {w: "majority"}}
)
db.pedidos.find({id: 200})
  .readPref("secondary")
  .readConcern("majority")

Transações Multidocumento

O MongoDB suporta transações multidocumento desde a versão 4.2. Recomenda-se usar apenas quando necessário, preferindo modelagem de dados adequada.

try (SessaoCliente sessao = cliente.iniciarSessao()) {
  sessao.iniciarTransacao();
  colecao.inserirUm(sessao, documento1);
  colecao.inserirUm(sessao, documento2);
  sessao.confirmarTransacao();
}

Considerações importantes:

  • Leituras em transações devem ser feitas no primário
  • Utilize drivers compatíveis com MongoDB 4.2+
  • Configure readConcern no nível da transação, não por operação

Tags: mongodb Transações writeConcern readConcern ReplicaSet

Publicado em 8-16 08:56