Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/

Gravações repetíveis

Nesta página

  • Pré-requisitos
  • Retryable Writes e transações multidocumentos
  • Habilitando Retryable Writes
  • Operações de Retryable Write
  • Comportamento

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.

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 os featureCompatibilityVersion de cada nó no cluster deve ser 3.6 ou superior. Consulte setFeatureCompatibilityVersion para obter mais informações sobre a bandeira featureCompatibilityVersion .
Escrever confirmação
As operações de gravação emitidas com uma Preocupação de Gravação de 0 não podem ser repetidas.

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.

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ção retryWrites=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 incluir retryWrites=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

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
findAndModify operações. Todas as operações findAndModify são operações de documento único.

db.collection.bulkWrite() com as seguintes operações de gravação:

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 updateMany.
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 update, que especifica true para a opção multi.

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.

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.

O comando serverStatus e seu assistente de shell mongosh db.serverStatus() incluem estatísticas sobre gravações repetíveis na seção transactions.

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.

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ótuloNoWritesPerformed.
Trabalho parcial feito. (Pelo menos um documento é inserido, mas não todos.)
Erro retornado sem rótulo NoWritesPerformed.
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.

Voltar

Gravação em massa