Callback API vs Core API
La API de devolución de llamada:
Inicia una transacción, ejecuta las operaciones especificadas y confirma (o anula por error).
Incorpora automáticamente la lógica de manejo de errores para
TransientTransactionErroryUnknownTransactionCommitResult.
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
TransientTransactionErroryUnknownTransactionCommitResult, y en su lugar proporciona la flexibilidad de incorporar un manejo de errores personalizado para estos errores.
Callback API
La Callback API incorpora lógica:
Para reintentar la transacción en su totalidad si la transacción encuentra un error
TransientTransactionError.Para reintentar la operación de confirmación si la confirmación encuentra un error
UnknownTransactionCommitResult.
A partir de MongoDB 6.2, el servidor no vuelve a intentar la transacción si recibe un error TransactionTooLargeForCache.
Ejemplo
Core API
La API de transacción principal no incorpora lógica de reintento para los errores etiquetados:
TransientTransactionError. Si una operación en una transacción devuelve un error etiquetado comoTransientTransactionError, se puede volver a intentar la transacción en su totalidad.Para manejar
TransientTransactionError, las aplicaciones deben incorporar explícitamente una lógica de reintento para el error.UnknownTransactionCommitResult. Si la confirmación devuelve un error etiquetado comoUnknownTransactionCommitResult, se puede volver a intentar la confirmación.Para manejar
UnknownTransactionCommitResult, las aplicaciones deben incorporar explícitamente una lógica de reintento para el error.
Ejemplo
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:
Versiones de controladores
Gestión de errores de transacción
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.
TransientTransactionError
Las operaciones de escritura individuales dentro de la transacción no se pueden reintentar, independientemente del valor de retryWrites. Si una operación encuentra un error asociado con la etiqueta "TransientTransactionError", como cuando el proceso principal retrocede, la transacción en su conjunto se puede reintentar.
La callback API incorpora lógica de reintento para
"TransientTransactionError".La API de transacciones principal no incorpora lógica de reintento para
"TransientTransactionError". Para gestionar"TransientTransactionError", las aplicaciones deben incorporar explícitamente lógica de reintento para el error. Para ver un ejemplo que incorpora lógica de reintento para errores transitorios, consulte el Ejemplo de API principal.
UnknownTransactionCommitResult
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 de transacciones principal no incorpora lógica de reintento para
"UnknownTransactionCommitResult". Para gestionar"UnknownTransactionCommitResult", las aplicaciones deben incorporar explícitamente lógica de reintento para el error. Para ver un ejemplo que incorpora lógica de reintento para errores de confirmación desconocidos, consulte el Ejemplo de API principal.
TransactionTooLargeForCache
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.
Información Adicional
mongosh Ejemplo
Los siguientes métodos mongosh están disponibles para transacciones:
Nota
El ejemplo mongosh omite la lógica de reintento y el manejo robusto de errores para simplificarlo. Para un ejemplo más práctico de cómo incorporar transacciones en aplicaciones, consulte Manejo de errores de 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();