MongoError: esta implantação do MongoDB não suporta gravações repetíveis. Adicione retryWrites = false à sua cadeia de conexão

10

Estou usando "mongoose": "^5.7.1"no meu projeto Node.js. Estou fazendo uma API que envolve a atualização em dois documentos. Então, eu estou usando as transações da seguinte forma:

// Start the transaction
session = await mongoose.startSession()
session.startTransaction()

await Promise.all([
   <1st update operation>,
   <2nd update operation>
])

// Commit the transaction
session.commitTransaction()

Quando acerto essa API no meu ambiente local, recebo o seguinte erro:

MongoError: esta implantação do MongoDB não suporta gravações repetíveis. Por favor, adicione retryWrites = false à sua cadeia de conexão.

Quando eu bati nesta API em ambiente remoto, ela funciona bem. Estou usando https://www.clever-cloud.com como nuvem de banco de dados e AWS como nuvem de API.

Conforme escrito na mensagem de erro, tentei colocar retryWrites=false

  • no final da cadeia de conexão que estou passando para o mangusto como mongodb://${ip}:${port}/${this.MONGO_DATABASE}?retryWrites=false
  • com as opções retryWrites: falsepassadas para o mongoose.connectmétodo
mongoose.connect(`mongodb://${ip}:${port}/${this.MONGO_DATABASE}`, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
    retryWrites: false
  }, (err) => {...})

Nenhuma das opções acima resolveu o problema.

Abaixo está a saída do mongo --versioncomando:

db version v4.0.13
git version: bda366f0b0e432ca143bc41da54d8732bd8d03c0
allocator: system
modules: none
build environment:
    distarch: x86_64
    target_arch: x86_64

Eu depurei e encontrei o erro real por trás do lançamento desse erro é:

MongoError: os números de transação são permitidos apenas em um membro ou mongos do conjunto de réplicas

Por favor, sugira algo.

Andro Developer
fonte
Comecei a ver esses erros também. Estou usando o Mlab no Heroku. Mas adicionar a opção no cliente resolveu isso. Eu apenas tentei a versão URI e funciona também. Estranho.
Mig
Estou usando um servidor autônomo e isso está causando esse erro. O erro inicial não foi o real e o posterior pode ser resolvido com conjuntos de réplicas ou clusters compartilhados. Veja npmjs.com/package/run-rs
Andro Developer

Respostas:

2

As transações são, sem dúvida, o novo recurso mais interessante do MongoDB 4.0. Infelizmente, porém, a maioria das ferramentas para instalar e executar o MongoDB inicia um servidor independente em oposição a um conjunto de réplicas. Se você tentar iniciar uma sessão em um servidor autônomo, receberá esse erro.

Esse problema pode ser resolvido usando conjuntos de réplicas no ambiente local.

Eu usei run-rs para esse fim.

Andro Developer
fonte
2

Conforme sugerido na resposta aceita, você precisa que o servidor local seja executado como um conjunto de réplicas para poder executar transações, em oposição ao servidor autônomo.

No entanto, além da solução proposta, você pode converter facilmente o banco de dados local autônomo em um conjunto de réplicas sem usar nenhuma ferramenta de terceiros , seguindo as instruções na documentação do MongoDB , resumidas da seguinte forma:

  1. Pare sua instância independente do mongod e reinicie-a com o replSetargumento
mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost
  1. Conecte-se à sua instância com um mongoshell e inicie o novo conjunto de réplicas.
rs.initiate()

Agora você deve ter um conjunto de réplicas em vez de um servidor mongodb independente, onde você pode executar transações no ambiente local para atualizar vários documentos de uma só vez!

Não esqueça de incluir o replSetargumento sempre que desejar iniciar o servidor, caso contrário, ele será iniciado como Independente. Eu simplesmente uso o mesmo comando da etapa 1 para executá-lo novamente.


Como alternativa, você pode implantar um novo conjunto de réplicas do zero para o ambiente de teste, seguindo estas outras instruções na documentação do MongoDB.

gasbi
fonte
0

Por favor, edite o App/Config/databasearquivo Add 'retryWrites'=>falsein Mongodb Connection String

escrever conexão Mongo db

'mongodb' => [
            'driver'   => 'mongodb',
            'host'     => env('MONGO_DB_HOST', 'lo*****'),
            'port'     => *****,
            'database' => env('MONGO_DB_DATABASE'),
            'username' => env('MONGO_DB_USERNAME'),
            'password' => env('MONGO_DB_PASSWORD'),
            'options'  => [
                'database'=> env('MONGO_DB_DATABASE'),
                'retryWrites'=>false
            ]
        ],

Save e corra

Arshit
fonte
0

Tente adicionar &retryWrites=falseà sua cadeia de conexão

-

Na verdade, recebi os erros mencionados no OP ao conectar-me ao nosso servidor db remoto, enquanto ele estava funcionando localmente. Entrei em contato com o suporte hospedado do mongo antes de tentar a sugestão que está no erro.

-

Isto é o que nosso site mongo hospedado (mLab) disse:

Provavelmente, o driver do seu aplicativo foi atualizado para uma versão mais recente, que está tentando usar um recurso exclusivo do WiredTiger. Como o erro menciona, você precisará adicionar & retryWrites = false à sua cadeia de conexão.

https://docs.mlab.com/faq/#why-am-i-getting-the-transaction-numbers-are-only-allowed-on-storage-engines-that-support-document-level-locking-error

kris
fonte