Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
sesión

Session.startTransaction() (mongosh method)

Session.startTransaction(<options>)

Comienza una Transacción multi-documento asociada a la sesión. En cualquier momento, puede tener como máximo una transacción abierta para una sesión.

Cambiado en la versión 4.2: A partir de MongoDB 4.2, las transacciones multi-documento están disponibles tanto para clústeres particionados como para sets de réplicas.

Importante

Dentro de una transacción, solo puedes especificar operaciones de lectura y escritura (CRUD) en colecciones existentes. Por ejemplo, una transacción multi-documento no puede incluir una operación de inserción que implique la creación de una nueva colección.

El método puede tomar un documento con las siguientes Session.startTransaction() opciones:

{ readConcern: { level: <level>}, writeConcern: { w: <value>, j: <boolean>, wtimeout: <number> } }
Opción
Descripción

readConcern

Opcional. Un documento que especifica el nivel de consistencia de lectura para todas las operaciones en la transacción, anulando el nivel de consistencia de lectura específico de la operación.

Puedes especificar uno de los siguientes niveles de consistencia de lectura:

Para las consultas de lectura y, MongoDB a veces puede sustituir una consulta de lectura más "local" "majority" fuerte.

writeConcern

opcional. Un documento que especifica el nivel de confirmación de escritura (write concern) para la transacción. Este nivel de confirmación de escritura (write concern) se aplica a las operaciones de commit y abort de la transacción.

Las operaciones dentro de la transacción utilizan "w: 1", anulando el nivel de confirmación de escritura (write concern) específico de la operación.

Si haces un commit usando el "w: 1" nivel de confirmación de escritura (write concern), tu transacción puede revertirse durante el proceso de conmutación por error.

Para los controladores de MongoDB, las transacciones usan el nivel de confirmación de escritura (write concern) a nivel de cliente como por defecto.

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

  • 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.

Nota

Si ejecutas con control de acceso, debes tener privilegios para las operaciones en la transacción.

Para transacciones multidocumento:

  • Puede crear colecciones e índices en transacciones. Para más información, consulte Crear colecciones e índices en una transacción.

  • Las colecciones utilizadas en una transacción pueden encontrarse en diferentes bases de datos.

    Nota

    No puedes crear nuevas colecciones en transacciones de escritura entre particiones. Por ejemplo, si guardas en una colección existente en una partición y creas implícitamente una colección en una partición diferente, MongoDB no puede realizar ambas operaciones en la misma transacción.

  • No se puede escribir en colecciones con tamaño fijo.

  • No puedes usar el nivel de consistencia de lectura "snapshot" al leer de una colección con tamaño fijo. (A partir de MongoDB 5.0)

  • No puedes leer ni escribir en colecciones en las bases de datos config, admin o local.

  • No se puede escribir en las colecciones de system.*.

  • No puedes devolver el plan de query de las operaciones admitidas usando explain o comandos similares.

  • Para los cursores creados fuera de una transacción, no puedes llamar a getMore dentro de la transacción.

  • Para los cursores creados en una transacción, no puedes llamar a getMore fuera de la transacción.

  • No puede especificar el comando killCursors como la primera operación en una transacción.

    Además, si ejecutas el comando killCursors dentro de una transacción, el servidor detiene inmediatamente los cursores especificados. No espera la confirmación de la transacción.

Método
Comando
Nota

Excluyendo las siguientes expresiones de operador de consulta:

El método utiliza la etapa de agregación $match para la query y una etapa de agregación $group con una expresión $sum para realizar el recuento.

Disponible en colecciones sin fragmentar.

For sharded collections, use the aggregation pipeline with the $group stage. See Distinct Operation.

Si la operación de actualización o reemplazo se ejecuta con upsert: true en una colección no existente, la colección se crea implícitamente.

Para obtener más detalles, consulta Operaciones de administración.

Si se ejecuta en una colección no existente, la colección se crea implícitamente.

Para obtener más detalles, consulta Operaciones de administración.

Si se ejecuta en una colección no existente, la colección se crea implícitamente.

Para obtener más detalles, consulta Operaciones de administración.

Si se ejecuta en una colección no existente, la colección se crea implícitamente.

Para obtener más detalles, consulta Operaciones de administración.

Las operaciones que afectan al catálogo de la base de datos, como crear o borrar una colección o un índice, no están permitidas en transacciones multidocumento. Por ejemplo, una transacción multidocumento no puede incluir una operación de inserción que resulte en la creación de una nueva colección. Consulta Operaciones restringidas.

Los comandos informativos, como hello, buildInfo, connectionStatus (y sus métodos asistentes) están permitidos en las transacciones; sin embargo, no pueden ser la primera operación de la transacción.

Las transacciones son compatibles con la preferencia de lectura primary.

Mientras la transacción esté abierta, ningún cambio de datos realizado por las operaciones en la transacción será visible fuera de la transacción:

  • Cuando se confirma una transacción, todos los cambios realizados en los datos se guardan y son visibles fuera de ella. Es decir, una transacción no confirmará algunos de sus cambios mientras revierte otros.

    Hasta que se produzca la confirmación de una transacción, los cambios de datos realizados en la transacción no son visibles fuera de la transacción.

    Sin embargo, cuando una transacción se guarda en múltiples fragmentos, no todas las operaciones de lectura externas necesitan esperar a que el resultado de la transacción confirmada sea visible en todos los fragmentos. Por ejemplo, si se confirma una transacción y la escritura 1 es visible en el fragmento A, pero la escritura 2 aún no es visible en el fragmento B, una lectura externa con el nivel de consistencia de lectura "local" puede leer los resultados de la escritura 1 sin ver la escritura 2.

  • 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.

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. 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 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 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 inicia una transacción, actualiza el estado de un empleado a Inactive en el estado employees e inserta un documento correspondiente en la colección events, así como confirma las dos operaciones como una única 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;
}
}
}
}
// Updates two collections in a transactions
function updateEmployeeInfo(session) {
employeesCollection = session.getDatabase("hr").employees;
eventsCollection = session.getDatabase("reporting").events;
session.startTransaction( { readConcern: { level: "snapshot" }, writeConcern: { w: "majority" } } );
try{
employeesCollection.updateOne( { employee: 3 }, { $set: { status: "Inactive" } } );
eventsCollection.insertOne( { employee: 3, status: { new: "Inactive", old: "Active" } } );
} catch (error) {
print("Caught exception during transaction, aborting.");
session.abortTransaction();
throw error;
}
commitWithRetry(session);
}
// 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

Session.commitTransaction() (método mongosh)

En esta página