Gravações repetíveis
Nesta página
As gravações repetíveis permitem que os drivers do MogoDB tentem realizar novamente determinadas operações uma única vez se houver erros de rede ou se eles não conseguirem encontrar um primário íntegro no conjunto de réplicas ou no cluster fragmentado.
Pré-requisitos
As retryable writes têm os seguintes requisitos:
- Topologias de implementação suportadas
- As gravações repetíveis exigem um conjunto de réplicas ou um cluster fragmentado e não oferecem suporte a instâncias autônomas.
- Mecanismo de armazenamento suportado
- As gravações que podem ser repetidas exigem um mecanismo de armazenamento que ofereça suporte ao bloqueio em nível de documento, como o WiredTiger ou mecanismos de armazenamento na memória.
- Mais de 3,6 drivers MongoDB
Os clientes exigem drivers do MongoDB atualizados para o MongoDB 3.6 ou posterior:
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
- A versão MongoDB de cada nó no cluster deve ser
3.6
ou superior e osfeatureCompatibilityVersion
de cada nó no cluster deve ser3.6
ou superior. ConsultesetFeatureCompatibilityVersion
para obter mais informações sobre a bandeirafeatureCompatibilityVersion
. - Escrever confirmação
- As operações de gravação emitidas com uma Preocupação de Gravação de
0
não podem ser repetidas.
Retryable Writes e transações multidocumentos
As operações de confirmação e cancelamento da transação são operações de retryable write. Se a operação de confirmação ou a operação de cancelamento encontrar um erro, os drivers do MongoDB tentarão novamente a operação uma única vez, mesmo se a retryWrites
estiver definida como false
.
As operações de escrita dentro da 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=true
pode 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=false
na cadeia de conexão. mongosh
As gravações repetíveis são habilitadas por padrão no
mongosh
. Para desativar gravações repetíveis, use a opção de linha de comando--retryWrites=false
:mongosh --retryWrites=false
Operações de Retryable Write
As seguintes operações de escrita são repetíveis quando emitidas com write concern reconhecida; por exemplo, Write Concern não pode ser {w: 0}
.
Observação
As operações de gravação dentro das transações não podem ser repetidas individualmente.
Métodos | Descrição |
---|---|
Inserir operações | |
Operações de atualização de documento único | |
Operações de exclusão 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 |
Comportamento
Erros de rede persistentes
As retryable writes do MongoDB fazem apenas uma tentativa de repetição. Isso ajuda a resolver erros de rede transitórios e eleições de conjuntos de réplicas, mas não erros de rede persistentes.
Período de failover
Se o driver não conseguir encontrar um primary íntegro no conjunto de réplicas de destino ou no shard do cluster fragmentado, os drivers aguardarão serverSelectionTimeoutMS
milissegundos para determinar o novo primary antes de tentar novamente. As retryable writes não abordam instâncias em que o período de failover excede serverSelectionTimeoutMS
.
Aviso
Se o aplicativo cliente parar temporariamente de responder por mais de localLogicalSessionTimeoutMinutes
depois de emitir uma operação de escrita, há uma chance de que, quando os aplicativos cliente começarem a responder (sem uma reinicialização), a operação de escrita possa ser tentada novamente e aplicada novamente.
Diagnóstico
O comando serverStatus
e seu assistente de shell mongosh
db.serverStatus()
incluem estatísticas sobre gravações repetíveis na seção transactions
.
Gravações repetíveis com relação ao banco de dados local
Os drivers oficiais do MongoDB permitem gravações repetíveis por padrão. Os aplicativos que gravam no banco de dados local
encontrarão erros de gravação, a menos que as gravações repetíveis sejam explicitamente desabilitadas.
Para desativar as gravações que podem ser repetidas, especifique retryWrites=false
na connection string do cluster MongoDB.
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.