Las escrituras reintentables permiten que los drivers reintenten operaciones de escritura específicas una vez después de errores de red o si no se puede encontrar un primario en el set de réplicas o clúster.
Compatibilidad
Las escrituras reintentables requieren:
- Topologías de implementación
- Un set de réplicas o un clúster. No es compatible con instancias autónomas.
- Motor de almacenamiento
- Un motor de almacenamiento con bloqueo a nivel de documento, como WiredTiger o en memoria.
- Controladores de MongoDB
Controladores compatibles con MongoDB 3.6+
Java 3.6+
Python 3.6+
C 1.9+
Go 1.8+
C# 2.5+
Node 3.0+
Ruby 2.5+
Rust 2.1+
Swift 1.2+
Perl 2.0+
PHPC 1.4+
Scala 2.2+
C++ 3.6.6+
- Versión de MongoDB
- MongoDB 3.6+ y
featureCompatibilityVersion3.6+ en todos los nodos. VersetFeatureCompatibilityVersion. - Guardar reconocimiento
- Las escrituras con nivel de confirmación de escritura (write concern)
0no son reiterables.
Comportamientos
Escrituras reintentables y transacciones multi-documento
Las operaciones de confirmación y abortar transacciones se pueden reintentar. Los controladores reintentan estas operaciones una vez si ocurre un error, incluso si retryWrites está false.
Las escrituras dentro de una transacción no son individualmente reintentables, independientemente del valor de retryWrites.
Para obtener más información sobre las transacciones, consulta Transacciones.
Activar las escrituras reintentables
- Controladores de MongoDB
- Los controladores compatibles con MongoDB 4.2 y superiores permiten
Escrituras reintentarles por defecto. Los controladores anteriores requieren la opción
retryWrites=true. La opciónretryWrites=truese puede omitir en las aplicaciones que utilizan drivers compatibles con MongoDB 4.2 y versiones superiores.Para desactivar las escrituras reintentables, las aplicaciones que utilizan controladores compatibles con MongoDB 4.2 y versiones posteriores deben incluirretryWrites=falseen la cadena de conexión. mongoshmongoshactiva por defecto las escrituras reintentables. Para desactivar, usar--retryWrites=false:mongosh --retryWrites=false
Operaciones de escritura reintentable
MongoDB reintenta las siguientes operaciones si tienen un nivel de confirmación de escritura reconocido (por ejemplo, el nivel de confirmación de escritura no puede ser {w: 0}):
Nota
Las escrituras dentro de transacciones no son individualmente reintentables.
Métodos | Descripciones |
|---|---|
Inserts | |
Actualizaciones de documentos individuales | |
Eliminación de un solo documento | |
| |
| Operaciones de guardado masiva que solo consisten en operaciones de guardado de un solo documento. Una operación masiva que se puede reintentar puede incluir cualquier combinación de las operaciones de guardado especificadas, pero no puede incluir ninguna operación de guardado de múltiples documentos, como |
| Operaciones de guardado masiva que solo consisten en operaciones de guardado de un solo documento. Una operación masiva que se puede reintentar puede incluir cualquier combinación de las operaciones de guardado especificadas, pero no puede incluir ninguna operación de guardado de múltiples documentos, como |
Errores persistentes de red
MongoDB reintenta las escrituras una vez. Esto se aplica a los errores de red transitorios y a las elecciones de set de réplicas, pero no a los errores de red persistentes.
Período de conmutación por error
Los conductores esperan serverSelectionTimeoutMS para encontrar un nuevo primario antes de volver a intentarlo. Las escrituras reintentables fallan si la conmutación por error toma más tiempo que este tiempo de espera.
Advertencia
Si un cliente no responde durante más de localLogicalSessionTimeoutMinutes, la guardar podría intentar nuevamente y aplicarse de nuevo cuando el cliente se recupere.
Diagnósticos
serverStatus incluye estadísticas de escritura reintentables en la sección transactions.
Escrituras Reintentos en la base de datos local
Los controladores oficiales activan por defecto las escrituras reintentables. Las escrituras en la local base de datos fallarán a menos que desactive las escrituras reintentables.
Para desactivar, establezca retryWrites=false en la cadena de conexión.
Error Handling
A partir de MongoDB 6.1, si tanto el primer como el segundo intento de una escritura reintentable fallan sin que se realice ni una sola escritura, MongoDB devuelve un error con la etiqueta NoWritesPerformed.
La etiqueta NoWritesPerformed diferencia los resultados de operaciones de agrupación como insertMany(). En una operación insertMany, puede ocurrir uno de los siguientes resultados:
Resultado | Salida de MongoDB |
|---|---|
No se han insertado documentos. | Error devuelto con la etiqueta |
Trabajo parcial completado. (Se ha insertado al menos un documento, pero no todos.) | Error devuelto sin la etiqueta |
Se insertan todos los documentos. | Éxito devuelto. |
Las aplicaciones pueden utilizar la etiqueta NoWritesPerformed para determinar de manera definitiva que no se insertaron documentos. Este reporte de errores permite que la aplicación mantenga un estado preciso de la base de datos al manejar escrituras reintentables.
En versiones anteriores de MongoDB, se devuelve un error cuando fallan tanto el primer como el segundo intento de una escritura reintentable. Sin embargo, no se hace ninguna distinción para indicar que no se realizaron las escrituras.