Transacciones
Transacciones multidocumento con aislamiento por instantánea entre rangos.
Las transacciones de MongoDB funcionan igual: abres una sesión, haces varias operaciones y las confirmas o las anulas juntas, aunque toquen documentos de rangos y nodos distintos.
const session = db.getMongo().startSession();
session.withTransaction(() => {
const cuentas = session.getDatabase("banco").cuentas;
cuentas.updateOne({ _id: "A" }, { $inc: { saldo: -100 } });
cuentas.updateOne({ _id: "B" }, { $inc: { saldo: 100 } });
});Aislamiento
Cada transacción lee una instantánea a su marca de lectura y ve sus propias escrituras. Dentro de una transacción,
readConcern local, majority y snapshot leen los tres esa misma instantánea.
Cómo confirma
Si todas las claves de la transacción están en un rango, se confirma en una fase. Si no, cada rango guarda versiones provisionales y un registro de transacción decide; la limpieza de esas versiones sigue en segundo plano después de responder.
Límites y errores
Las etiquetas de error (TransientTransactionError, UnknownTransactionCommitResult) y el reintento del commit son los
de MongoDB, así que withTransaction de los drivers reintenta lo que debe. transactionLifetimeLimitSeconds vale 60
por defecto y se cambia con setParameter.
Consistencia causal
Las sesiones causales de los drivers funcionan: una lectura con afterClusterTime ve todo lo que la sesión ya
escribió o leyó, también si va a otra réplica.