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