As gravações repetíveis permitem que os drivers repitam operações de escrita específicas uma vez após erros de rede ou se não conseguirem encontrar um primário íntegro no conjunto de réplicas ou no cluster.
Compatibilidade
As gravações repetíveis exigem:
- Topologias de implantação
- Um conjunto de réplicas ou cluster fragmentado. Não suportado em instâncias autônomo.
- Mecanismo de armazenamento
- Um mecanismo de armazenamento com bloqueio em nível de documento, como WiredTiger ou na memória.
- MongoDB Drivers
Drivers compatíveis com o MongoDB 3.6+.
Java 3.6+
Python 3,6+
C 1.9+
Go 1.8+
C# 2.5+
Nó 3.0+
Ruby 2,5+
Rust 2.1+
Swift 1.2+
Perl 2.0+
PHPC 1.4+
Scala 2,2+
C++ 3.6.6+
- Versão do MongoDB
- MongoDB 3.6+ e
featureCompatibilityVersion3.6+ em todos os nós. ConsultesetFeatureCompatibilityVersion. - Escrever confirmação
- As gravações com preocupação de gravação
0não podem ser repetidas.
Comportamentos
Retryable Writes e transações multidocumentos
As operações de confirmação e cancelamento da transação podem ser repetidas. Os drivers tentam novamente essas operações uma vez em caso de erro, mesmo que retryWrites seja false.
As gravações dentro de uma transação não podem ser repetidas individualmente, independentemente do valor de retryWrites.
Para obter mais informações sobre transações, consulte Transações.
Habilitando Retryable Writes
- MongoDB Drivers
- Drivers compatíveis com o MongoDB 4.2 e superiores habilitam Retryable Writes por padrão. Drivers anteriores exigem a opção
retryWrites=true. A opçãoretryWrites=truepode ser omitida em aplicativos que utilizam drivers compatíveis com o MongoDB 4.2 e superior.Para desabilitar gravações repetitivas, os aplicativos que usam drivers compatíveis com o MongoDB 4.2 e superiores devem incluirretryWrites=falsena cadeia de conexão. mongoshmongoshhabilita gravações repetíveis por padrão. Para desabilitar, utilize--retryWrites=false:mongosh --retryWrites=false
Operações de Retryable Write
O MongoDB tenta novamente as seguintes operações se tiver reconhecido o preocupação de gravação (por exemplo, opreocupação de gravação não pode {w: 0} ser):
Observação
As gravações dentro de transações não podem ser repetidas individualmente.
Métodos | Descrição |
|---|---|
Inserções | |
Atualizações de documento único | |
Exclusões de documento único | |
| |
| Operações de escrita em massa que consistem apenas nas operações de escrita de documento único. Uma operação em massa repetível pode incluir qualquer combinação das operações de escrita especificadas, mas não pode incluir nenhuma operação de escrita de vários documentos, como |
Operações de escrita em massa que consistem apenas nas operações de escrita de documento único. Uma operação em massa repetível pode incluir qualquer combinação das operações de escrita especificadas, mas não pode incluir nenhuma operação de escrita de vários documentos, como |
Erros de rede persistentes
O MongoDB tenta novamente gravações uma vez. Isso corrige erros de rede transitórios e eleições de conjuntos de réplicas, mas não erros de rede persistentes.
Período de failover
Os drivers aguardam serverSelectionTimeoutMS para encontrar um novo primário antes de tentar novamente. As gravações repetíveis falharão se o failover demorar mais do que esse tempo limite.
Aviso
Se um cliente não responder por mais de localLogicalSessionTimeoutMinutes, a gravação poderá tentar novamente e aplicar novamente quando o cliente se recuperar.
Diagnóstico
serverStatus inclui estatísticas de gravações repetíveis na seção transactions.
Gravações repetíveis com relação ao banco de dados local
Os drivers oficiais permitem gravações repetíveis por padrão. As gravações no local banco de dados falharão, a menos que você desative as gravações repetíveis.
Para desativar, defina retryWrites=false na string de conexão.
Error Handling
A partir do MongoDB 6.1, se a primeira e segunda tentativas de uma retryable write falharem sem que uma única gravação seja executada, o MongoDB retornará um erro com o rótulo NoWritesPerformed.
O rótulo NoWritesPerformed diferencia os resultados de operações em lote como insertMany(). Em uma operação insertMany, um dos seguintes desfechos pode ocorrer:
Resultado | Saída MongoDB |
|---|---|
Nenhum documento é inserido. | Erro retornado com rótulo |
Trabalho parcial feito. (Pelo menos um documento é inserido, mas não todos.) | Erro retornado sem rótulo |
Todos os documentos são inseridos. | Retornou com sucesso. |
A aplicação pode usar o rótulo NoWritesPerformed para determinar definitivamente que nenhum documento foi inserido. Esse relatório de erros permite que o aplicativo mantenha um estado preciso do banco de dados ao lidar com retryable writes.
Nas versões anteriores do MongoDB, um erro é retornado quando a primeira e a segunda tentativas de uma retryable write falha. No entanto, não há distinção que indique que nenhuma gravação foi realizada.