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: false
transmises à lamongoose.connect
mé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 --version
commande:
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.
Réponses:
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.
la source
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:
replSet
argument.mongo
shell et lancez le nouveau jeu de réplicas.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'
replSet
argument 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.
la source
Veuillez modifier le
App/Config/database
fichier Ajouter'retryWrites'=>false
dans la chaîne de connexion Mongodbécrire la connexion Mongo db
Enregistrer et exécuter
la source
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
la source