Callback API vs Core API
The Callback API:
Inicia una transacción, ejecuta las operaciones especificadas y confirma (o anula por error).
Automatically incorporates error handling logic for
TransientTransactionErrorandUnknownTransactionCommitResult.
The Core API:
Requiere llamar explícitamente para iniciar la transacción y la confirmación de la transacción.
Does not incorporate error handling logic for
TransientTransactionErrorandUnknownTransactionCommitResult, and instead provides the flexibility to incorporate custom error handling for these errors.
Callback API
La Callback API incorpora lógica:
To retry the transaction as a whole if the transaction encounters a
TransientTransactionErrorerror.To retry the commit operation if the commit encounters an
UnknownTransactionCommitResulterror.
A partir de MongoDB,6.2 el servidor no vuelve a intentar la transacción si recibe un TransactionTooLargeForCache error.
Ejemplo
Core API
La API de transacción principal no incorpora lógica de reintento para los errores etiquetados:
TransientTransactionError. If an operation in a transaction returns an error labeledTransientTransactionError, the transaction as a whole can be retried.To handle
TransientTransactionError, applications should explicitly incorporate retry logic for the error.UnknownTransactionCommitResult. If the commit returns an error labeledUnknownTransactionCommitResult, the commit can be retried.To handle
UnknownTransactionCommitResult, applications should explicitly incorporate retry logic for the 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
The individual write operations inside the transaction are not retryable, regardless of the value of retryWrites. If an operation encounters an error associated with the label "TransientTransactionError", such as when the primary steps down, the transaction as a whole can be retried.
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.
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 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.
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
The following mongosh methods are available for transactions:
Nota
The mongosh example omits retry logic and robust error handling for simplicity's sake. For a more practical example of incorporating transactions in applications, see Transaction Error Handling instead.
// 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();