MongoError: esta implementación de MongoDB no admite escrituras recuperables. Agregue retryWrites = false a su cadena de conexión

10

Estoy usando "mongoose": "^5.7.1"en mi proyecto Node.js. Estoy haciendo una API que implica la actualización en dos documentos. Entonces, estoy usando las transacciones como las siguientes:

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

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

// Commit the transaction
session.commitTransaction()

Cuando llego a esta API en mi entorno local, aparece el siguiente error:

MongoError: esta implementación de MongoDB no admite escrituras recuperables. Agregue retryWrites = false a su cadena de conexión.

Cuando presiono esta API en un entorno remoto, entonces funciona bien. Estoy usando https://www.clever-cloud.com como nube de base de datos y AWS como nube de API.

Como está escrito en el mensaje de error, he intentado poner retryWrites=false

  • al final de la cadena de conexión que estoy pasando a mangosta como mongodb://${ip}:${port}/${this.MONGO_DATABASE}?retryWrites=false
  • con opciones retryWrites: falsepasadas al mongoose.connectmétodo.
mongoose.connect(`mongodb://${ip}:${port}/${this.MONGO_DATABASE}`, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
    retryWrites: false
  }, (err) => {...})

Ninguno de los anteriores resolvió el problema.

A continuación se muestra la salida del mongo --versioncomando:

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

He depurado y encuentro que el error real detrás de lanzar este error es:

MongoError: los números de transacción solo se permiten en un miembro de conjunto de réplica o mongos

Por favor sugiera algo.

Andro Developer
fuente
Empecé a ver estos errores también. Estoy usando Mlab en Heroku. Pero agregar la opción en el cliente resolvió esto. Acabo de probar la versión URI y también funciona. Extraño.
Mig
Estoy usando un servidor independiente y eso está causando este error. El error inicial no fue el real y el posterior puede resolverse con conjuntos de réplicas o clústeres compartidos. Ver npmjs.com/package/run-rs
Andro desarrollador

Respuestas:

2

Las transacciones son, sin duda, la nueva característica más emocionante de MongoDB 4.0. Pero desafortunadamente, la mayoría de las herramientas para instalar y ejecutar MongoDB inician un servidor independiente en lugar de un conjunto de réplicas. Si intenta iniciar una sesión en un servidor independiente, obtendrá este error.

Este problema se puede resolver mediante el uso de conjuntos de réplicas en su entorno local.

He usado corredores para este propósito.

Andro Developer
fuente
2

Como se sugiere en la respuesta aceptada, debe tener su servidor local para que se ejecute como un conjunto de réplicas para poder realizar transacciones, en lugar de un servidor independiente.

Sin embargo, además de la solución propuesta, puede convertir fácilmente su base de datos local independiente en un conjunto de réplicas sin usar ninguna herramienta de terceros , siguiendo las instrucciones en la documentación de MongoDB , resumidas de la siguiente manera:

  1. Detenga su instancia independiente de mongod y reiníciela con el replSetargumento.
mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost
  1. Conéctese a su instancia con un mongoshell e inicie el nuevo conjunto de réplicas.
rs.initiate()

¡Ahora debería tener un conjunto de réplicas en lugar de un servidor mongodb independiente, donde puede realizar transacciones en su entorno local para actualizar varios documentos a la vez!

No olvide incluir el replSetargumento cada vez que desee iniciar el servidor; de lo contrario, se iniciará como Independiente. Simplemente uso el mismo comando que en el paso 1 para ejecutarlo nuevamente.


Alternativamente, puede implementar un nuevo conjunto de réplica desde cero para probar el entorno siguiendo estas otras instrucciones en la documentación de MongoDB.

gasbi
fuente
0

Edite el App/Config/databasearchivo Agregar 'retryWrites'=>falseen la cadena de conexión Mongodb

escribir conexión 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
            ]
        ],

Guardar y correr

Arshit
fuente
0

Intenta agregar &retryWrites=falsea tu cadena de conexión

-

De hecho, recibí los errores mencionados en el OP cuando me conecté a nuestro servidor de base de datos remoto, mientras funcionaba localmente. Me puse en contacto con nuestro soporte alojado por mongo antes de probar la sugerencia que aparece en el error.

-

Esto es lo que dijo nuestro sitio alojado de mongo (mLab):

Es probable que el controlador de su aplicación se haya actualizado a una versión más reciente que intenta utilizar una función exclusiva de WiredTiger. Como se menciona en el error, deberá agregar & retryWrites = false a su cadena de conexión.

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
fuente