MongoError: questa distribuzione MongoDB non supporta le scritture ripetibili. Aggiungi retryWrites = false alla stringa di connessione


10

Sto usando "mongoose": "^5.7.1"nel mio progetto Node.js. Sto realizzando un'API che prevede l'aggiornamento in due documenti. Quindi, sto usando le transazioni come segue:

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

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

// Commit the transaction
session.commitTransaction()

Quando colpisco questa API sul mio ambiente locale, ottengo il seguente errore:

MongoError: questa distribuzione MongoDB non supporta le scritture ripetibili. Aggiungi retryWrites = false alla stringa di connessione.

Quando colpisco questa API su un ambiente remoto, funziona alla perfezione. Sto usando https://www.clever-cloud.com come cloud del database e AWS come api cloud.

Come scritto nel messaggio di errore, ho provato a mettere retryWrites=false

  • alla fine della stringa di connessione che sto passando a mangusta come mongodb://${ip}:${port}/${this.MONGO_DATABASE}?retryWrites=false
  • con opzioni retryWrites: falsepassate al mongoose.connectmetodo
mongoose.connect(`mongodb://${ip}:${port}/${this.MONGO_DATABASE}`, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
    retryWrites: false
  }, (err) => {...})

Nessuno dei precedenti ha risolto il problema.

Di seguito è riportato l'output del mongo --versioncomando:

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

Ho il debug e trovo l'errore reale dietro a lanciare questo errore è:

MongoError: i numeri di transazione sono consentiti solo su un membro del set di repliche o sui monghi

Per favore, suggerisci qualcosa.


Ho iniziato a vedere anche questi errori. Sto usando Mlab su Heroku. Ma l'aggiunta dell'opzione sul client ha risolto questo problema. Ho appena provato la versione URI e funziona anche. Strano.
Mig

Sto usando un server autonomo e questo sta causando questo errore. L'errore iniziale non era effettivo e quello successivo può essere risolto con set di repliche o cluster condivisi. Vedi npmjs.com/package/run-rs
Andro Developer il

Risposte:


2

Le transazioni sono senza dubbio la nuova funzionalità più interessante di MongoDB 4.0. Sfortunatamente, la maggior parte degli strumenti per l'installazione e l'esecuzione di MongoDB avvia un server autonomo anziché un set di repliche. Se si tenta di avviare una sessione su un server autonomo, verrà visualizzato questo errore.

Questo problema può essere risolto utilizzando set di repliche nell'ambiente locale.

Ho usato run-rs per questo scopo.


2

Come suggerito nella risposta accettata, è necessario che il server locale sia eseguito come set di repliche per poter eseguire le transazioni, al contrario del server autonomo.

Tuttavia, oltre alla soluzione proposta, è possibile convertire facilmente il proprio db locale autonomo in un set di repliche senza utilizzare alcuno strumento di terze parti , seguendo le istruzioni nella documentazione MongoDB , riassunte come segue:

  1. Arresta l'istanza mongod autonoma e riavviala con l' replSetargomento.
mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost
  1. Connettiti alla tua istanza con una mongoshell e avvia il nuovo set di repliche.
rs.initiate()

Ora dovresti avere un set di repliche anziché un server mongodb autonomo, in cui puoi eseguire transazioni sul tuo ambiente locale per aggiornare più documenti contemporaneamente!

Non dimenticare di includere l' replSetargomento ogni volta che desideri avviare il server, altrimenti verrà avviato come autonomo. Uso semplicemente lo stesso comando del passaggio 1 per eseguirlo di nuovo.


In alternativa, è possibile distribuire una nuova replica Set da zero per testare l'ambiente seguendo queste altre istruzioni di documentazione MongoDB.


0

Modifica il App/Config/databasefile Aggiungi 'retryWrites'=>falsenella stringa di connessione Mongodb

scrivi Mongo db connection

'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
            ]
        ],

Salva ed esegui


0

Prova ad aggiungere &retryWrites=falsealla stringa di connessione

-

In realtà ho riscontrato gli errori menzionati nell'OP durante la connessione al nostro server db remoto, mentre funzionava localmente. Ho contattato il nostro supporto ospitato da mongo prima di provare il suggerimento che si trova nell'errore.

-

Questo è ciò che ha detto il nostro sito mongo ospitato (mLab):

È probabile che il driver della tua app sia stato aggiornato a una versione più recente che sta tentando di utilizzare una funzione solo WiredTiger. Come menzionato dall'errore, dovrai aggiungere & retryWrites = false alla tua stringa di connessione.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.