Docs Menu
Docs Home
/ /

Session.abortTransaction() (mongosh method)

Session.abortTransaction()

Termina el Transacción multidocumento y revierte cualquier cambio de datos realizado por las operaciones dentro de la transacción. Es decir, la transacción finaliza sin guardar ninguno de los cambios realizados por las operaciones.

Las transacciones de múltiples documentos están disponibles tanto para clústeres fragmentados como para conjuntos de réplicas.

Session.abortTransaction() no devuelve un valor.

Importante

Método mongosh

Esta página documenta una mongosh Método. Esta no es la documentación para comandos de base de datos ni para 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.

Este método está disponible en implementaciones alojadas en los siguientes entornos:

  • MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube

Nota

Este comando es compatible con todos los clústeres de MongoDB Atlas. Para obtener información sobre el soporte de Atlas para todos los comandos, consulte Comandos no compatibles.

  • MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB

  • MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.

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.

Si se ejecuta con auditoría, las operaciones en una transacción cancelada aún se auditan.

Si la operación de cancelación detecta un error, los controladores de MongoDB reintentan la operación una vez, independientemente de si está retryWrites configurado true en. Para obtener más información, consulte Manejo de errores de transacciones.

Imagine un escenario en el que, al realizar cambios en el registro de un empleado en la base de datos hr, desea asegurarse de que la colección events en la base de datos reporting esté sincronizada con los cambios hr y viceversa. Es decir, desea asegurarse de que estas escrituras se realicen como una sola transacción, de modo que ambas operaciones se realicen correctamente o fallen.

La colección employees en la base de datos hr tiene 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 tiene 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 e intenta agregar un registro a la colección events y un documento a la colección employees. Si se produce un error en la operación o al confirmar la transacción, la sesión la cancela.

// 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();
}

Tip

Volver

Sesión

En esta página