MongoError: ce déploiement MongoDB ne prend pas en charge les écritures pouvant être réessayées. Veuillez ajouter retryWrites = false à votre chaîne de connexion

10

J'utilise "mongoose": "^5.7.1"dans mon projet Node.js. Je fais une api qui implique la mise à jour dans deux documents. Donc, j'utilise les transactions comme suit:

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

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

// Commit the transaction
session.commitTransaction()

Lorsque je frappe cette API sur mon environnement local, j'obtiens l'erreur suivante:

MongoError: ce déploiement MongoDB ne prend pas en charge les écritures pouvant être réessayées. Veuillez ajouter retryWrites = false à votre chaîne de connexion.

Lorsque je frappe cette API sur un environnement distant, cela fonctionne bien. J'utilise https://www.clever-cloud.com comme cloud de base de données et AWS comme cloud api.

Comme écrit dans le message d'erreur, j'ai essayé de mettre retryWrites=false

  • à la fin de la chaîne de connexion que je passe à mangouste mongodb://${ip}:${port}/${this.MONGO_DATABASE}?retryWrites=false
  • avec des options retryWrites: falsetransmises à la mongoose.connectméthode.
mongoose.connect(`mongodb://${ip}:${port}/${this.MONGO_DATABASE}`, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
    retryWrites: false
  }, (err) => {...})

Aucune des réponses ci-dessus n'a résolu le problème.

Voici la sortie de la mongo --versioncommande:

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

J'ai débogué et je trouve que l'erreur réelle derrière le lancement de cette erreur est:

MongoError: les numéros de transaction ne sont autorisés que sur un membre de jeu de répliques ou des mongos

Veuillez suggérer quelque chose.

Développeur Andro
la source
J'ai également commencé à voir ces erreurs. J'utilise Mlab sur Heroku. Mais l'ajout de l'option sur le client a résolu ce problème. Je viens d'essayer la version URI et ça marche aussi. Étrange.
Mig
J'utilise un serveur autonome et cela provoque cette erreur. L'erreur initiale n'était pas réelle et la dernière peut être résolue avec des clusters de réplicas ou partagés. Voir npmjs.com/package/run-rs
Développeur Andro

Réponses:

2

Les transactions sont sans aucun doute la nouvelle fonctionnalité la plus excitante de MongoDB 4.0. Mais malheureusement, la plupart des outils d'installation et d'exécution de MongoDB démarrent un serveur autonome par opposition à un jeu de répliques. Si vous essayez de démarrer une session sur un serveur autonome, vous obtiendrez cette erreur.

Ce problème peut être résolu en utilisant des jeux de réplicas sur votre environnement local.

J'ai utilisé run-rs à cet effet.

Développeur Andro
la source
2

Comme suggéré dans la réponse acceptée, vous devez avoir votre serveur local à exécuter en tant que jeu de répliques pour pouvoir effectuer des transactions, par opposition au serveur autonome.

Cependant, en plus de la solution proposée, vous pouvez facilement convertir votre base de données locale autonome en un jeu de réplicas sans utiliser aucun outil tiers , en suivant les instructions de la documentation MongoDB , résumées comme suit:

  1. Arrêtez votre instance mongod autonome et redémarrez-la avec l' replSetargument.
mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost
  1. Connectez-vous à votre instance avec un mongoshell et lancez le nouveau jeu de réplicas.
rs.initiate()

Vous devriez maintenant avoir un jeu de réplicas au lieu d'un serveur mongodb autonome, où vous pouvez effectuer des transactions sur votre environnement local pour mettre à jour plusieurs documents à la fois!

N'oubliez pas d'inclure l' replSetargument chaque fois que vous souhaitez démarrer le serveur, sinon il sera démarré en mode autonome. J'utilise simplement la même commande qu'à l'étape 1 pour l'exécuter à nouveau.


Vous pouvez également déployer un nouvel ensemble de réplicas à partir de zéro pour l'environnement de test en suivant ces autres instructions dans la documentation MongoDB.

gasbi
la source
0

Veuillez modifier le App/Config/databasefichier Ajouter 'retryWrites'=>falsedans la chaîne de connexion Mongodb

écrire la connexion 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
            ]
        ],

Enregistrer et exécuter

Arshit
la source
0

Veuillez essayer d'ajouter &retryWrites=falseà votre chaîne de connexion

-

J'ai en fait obtenu les erreurs mentionnées dans l'OP lors de la connexion à notre serveur db distant, alors qu'il fonctionnait localement. J'ai contacté notre support hébergé mongo avant d'essayer la suggestion qui est dans l'erreur.

-

Voici ce que notre site de mongo hébergé (mLab) a déclaré:

Il est probable que le pilote de votre application ait été mis à jour vers une version plus récente qui tente d'utiliser une fonctionnalité uniquement WiredTiger. Comme le mentionne l'erreur, vous devrez ajouter & retryWrites = false à votre chaîne de connexion.

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
la source