Definición
Session.abortTransaction()Termina la transacción multi-documento y revierte cualquier cambio de datos realizado por las operaciones dentro de la transacción. Es decir, la transacción termina sin guardar ninguno de los cambios realizados por las operaciones en la transacción.
Las transacciones multi-documento están disponibles tanto para clústeres fragmentados como para sets de réplicas.
Session.abortTransaction()no devuelve ningún valor.Importante
Método mongosh
Esta página documenta a Método
mongosh. Esta no es la documentación de comandos de base de datos ni de controladores específicos del lenguaje, como Node.js.Para el comando de base de datos, consulta el comando
abortTransaction.Para los drivers de API de MongoDB, consulte la documentación del driver de MongoDB específica del lenguaje.
Comportamiento
Atomicidad
Cuando una transacción se aborta, todos los cambios de datos realizados por las escrituras en la transacción se descartan sin que nunca sean visibles y la transacción termina.
Seguridad
Si se ejecuta con auditoría, las operaciones de una transacción anulada siguen auditándose.
Reintentar
Si la operación de aborto encuentra un error, los controladores de MongoDB reintentan la operación de aborto una sola vez independientemente de si retryWrites está configurado en true. Para obtener más información, consultar Gestión de errores de transacción.
Ejemplo
Considera un escenario en el que, a medida que se realizan cambios en el registro de un empleado en la base de datos hr, deseas garantizar que la colección events en la base de datos reporting esté sincronizada con los cambios hr y viceversa. Es decir, se desea garantizar que estos guardados se realicen como una sola transacción, de modo que ambas operaciones sean exitosas o fallen.
La colección employees en la base de datos hr contiene los siguientes documentos:
{ "_id" : ObjectId("5af0776263426f87dd69319a"), "employee" : 3, "name" : { "title" : "Mr.", "name" : "Iba Ochs" }, "status" : "Active", "department" : "ABC" } { "_id" : ObjectId("5af0776263426f87dd693198"), "employee" : 1, "name" : { "title" : "Miss", "name" : "Ann Thrope" }, "status" : "Active", "department" : "ABC" } { "_id" : ObjectId("5af0776263426f87dd693199"), "employee" : 2, "name" : { "title" : "Mrs.", "name" : "Eppie Delta" }, "status" : "Active", "department" : "XYZ" }
La colección employees tiene un índice único en el campo employee:
db.employees.createIndex( { employee: 1 }, { unique: true } )
La colección events en la base de datos reporting contiene los siguientes documentos:
{ "_id" : ObjectId("5af07daa051d92f02462644a"), "employee" : 1, "status" : { "new" : "Active", "old" : null }, "department" : { "new" : "ABC", "old" : null } } { "_id" : ObjectId("5af07daa051d92f02462644b"), "employee" : 2, "status" : { "new" : "Active", "old" : null }, "department" : { "new" : "XYZ", "old" : null } } { "_id" : ObjectId("5af07daa051d92f02462644c"), "employee" : 3, "status" : { "new" : "Active", "old" : null }, "department" : { "new" : "ABC", "old" : null } }
El siguiente ejemplo abre una transacción, intenta añadir un registro a la colección events y añadir un documento a la colección employees. Si la operación encuentra un error o bien en las operaciones o al realizar la transacción, la sesión cancela la transacción.
// Runs the txnFunc and retries if TransientTransactionError encountered function runTransactionWithRetry(txnFunc, session) { while (true) { try { txnFunc(session); // performs transaction break; } catch (error) { // If transient error, retry the whole transaction if (error?.errorLabels?.includes("TransientTransactionError")) { print("TransientTransactionError, retrying transaction ..."); continue; } else { throw error; } } } } // Retries commit if UnknownTransactionCommitResult encountered function commitWithRetry(session) { while (true) { try { session.commitTransaction(); // Uses write concern set at transaction start. print("Transaction committed."); break; } catch (error) { // Can retry commit if (error?.errorLabels?.includes("UnknownTransactionCommitResult") ) { print("UnknownTransactionCommitResult, retrying commit operation ..."); continue; } else { print("Error during commit ..."); throw error; } } } } // Performs inserts and count in a transaction function updateEmployeeInfo(session) { employeesCollection = session.getDatabase("hr").employees; eventsCollection = session.getDatabase("reporting").events; // Start a transaction for the session that uses: // - read concern "snapshot" // - write concern "majority" session.startTransaction( { readConcern: { level: "snapshot" }, writeConcern: { w: "majority" } } ); try{ eventsCollection.insertOne( { employee: 3, status: { new: "Active", old: null }, department: { new: "XYZ", old: null } } ); // Count number of events for employee 3 var countDoc = eventsCollection.aggregate( [ { $match: { employee: 3 } }, { $count: "eventCounts" } ] ).next(); print( "events count (in active transaction): " + countDoc.eventCounts ); // The following operations should fail as an employee ``3`` already exist in employees collection employeesCollection.insertOne( { employee: 3, name: { title: "Miss", name: "Terri Bachs" }, status: "Active", department: "XYZ" } ); } catch (error) { print("Caught exception during transaction, aborting."); session.abortTransaction(); throw error; } commitWithRetry(session); } // End of updateEmployeeInfo function // Start a session. session = db.getMongo().startSession( { readPreference: { mode: "primary" } } ); try{ runTransactionWithRetry(updateEmployeeInfo, session); } catch (error) { // Do something with error } finally { session.endSession(); }