Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs Menu

Gestionar transacciones en aplicaciones con la API de controladores

Callback API:

Core API:

  • Requiere llamar explícitamente para iniciar la transacción y la confirmación de la transacción.

  • No incorpora lógica de manejo de errores para TransientTransactionError y UnknownTransactionCommitResult, y en su lugar proporciona la flexibilidad para incorporar un manejo de errores personalizado para estos errores.

La Callback API incorpora lógica:

A partir de MongoDB 6.2, el servidor no vuelve a intentar la transacción si recibe un error TransactionTooLargeForCache.

La API de transacción principal no incorpora lógica de reintento para los errores etiquetados:

En el siguiente ejemplo, se incorpora la lógica para reintentar la transacción cuando se producen errores transitorios y para reintentar la confirmación cuando ocurre un error de confirmación desconocido:

Independientemente del sistema de base de datos, ya sea MongoDB o bases de datos relacionales, las aplicaciones deben tomar medidas para gestionar los errores durante la confirmación de transacciones e incorporar una lógica de reintento para las transacciones.

Las operaciones de guardado individuales dentro de la transacción no se pueden volver a intentar, independientemente del valor de retryWrites. Si en una operación, se produce un error asociado con la etiqueta "TransientTransactionError", por ejemplo, cuando el primario se degrada, se puede volver a intentar la transacción en su totalidad.

  • La callback API incorpora lógica de reintento para "TransientTransactionError".

  • La API central de transacción no incorpora lógica de reintentos para "TransientTransactionError". Para gestionar "TransientTransactionError", las aplicaciones deben incorporar explícitamente la lógica de reintentos para el error. Para ver un ejemplo que incorpora lógica de reintentos para errores transitorios, consulta Ejemplo de Core API.

Las operaciones de confirmación son operaciones de escritura reintentable. Si se produce un error en la operación de confirmación, los drivers de MongoDB vuelven a intentar la confirmación independientemente del valor de retryWrites.

Si en la operación de confirmación, se produce un error etiquetado "UnknownTransactionCommitResult", se puede reintentar la confirmación.

  • La callback API incorpora lógica de reintento para "UnknownTransactionCommitResult".

  • La API central de transacción no incorpora lógica de reintentos para "UnknownTransactionCommitResult". Para gestionar "UnknownTransactionCommitResult", las aplicaciones deben incorporar explícitamente la lógica de reintentos para el error. Para ver un ejemplo que incorpora la lógica de reintento para errores de confirmación desconocidos, consulta Ejemplo de Core API.

Nuevo en la versión 6.2.

A partir de MongoDB 6.2, el servidor no reintenta la transacción si recibe un error TransactionTooLargeForCache. Este error significa que la caché es demasiado pequeña y es probable que falle el reintento.

El valor por defecto para el umbral transactionTooLargeForCacheThreshold es 0.75. El servidor devuelve TransactionTooLargeForCache en lugar de reintentar la transacción cuando esta usa más del 75 % de la caché.

En versiones anteriores de MongoDB, el servidor devolvía TemporarilyUnavailable o WriteConflict en lugar de TransactionTooLargeForCache.

Utiliza el comando setParameter para modificar el umbral de error.

Los siguientes métodos mongosh están disponibles para las transacciones:

Nota

El ejemplo mongosh omite la lógica de reintento y el manejo robusto de errores para simplificarlo. Para ver un ejemplo más práctico de cómo incorporar transacciones en las aplicaciones, consulta Manejo de errores de las transacciones.

// Create collections:
db.getSiblingDB("mydb1").foo.insertOne(
{abc: 0},
{ writeConcern: { w: "majority", wtimeout: 2000 } }
)
db.getSiblingDB("mydb2").bar.insertOne(
{xyz: 0},
{ writeConcern: { w: "majority", wtimeout: 2000 } }
)
// Start a session.
session = db.getMongo().startSession( { readPreference: { mode: "primary" } } );
coll1 = session.getDatabase("mydb1").foo;
coll2 = session.getDatabase("mydb2").bar;
// Start a transaction
session.startTransaction( { readConcern: { level: "local" }, writeConcern: { w: "majority" } } );
// Operations inside the transaction
try {
coll1.insertOne( { abc: 1 } );
coll2.insertOne( { xyz: 999 } );
} catch (error) {
// Abort transaction on error
session.abortTransaction();
throw error;
}
// Commit the transaction using write concern set at transaction start
session.commitTransaction();
session.endSession();