Transacciones en MongoDB 4.0. Ejemplos de uso

transacciones en MongoDB 4.0Hola,hoy vamos a hablaros de una importante novedad introducida en MongoDB. Se trata de la introducción de las transacciones en MongoDB 4.0.

Hasta ahora, MongoDB se había diferenciado de las bases de datos relaciones o RDBMS por su apuesta por la atomicidad. La incorporación de las transacciones en MongoDB supone un antes y un después entorno a MongoDB. Veamos para qué se usan, sus requisitos y cómo utilizarlas.

¿Para qué se usan las transacciones ACID?

Las transacciones ACID garantizan que la misma se ha realizado correctamente. Para ello, cuando modificamos dos documentos, si en uno de ellos hay error, la transacción será cancelada. Si los dos documentos se han modificado correctamente, la transacción se completará correctamente.

Requisitos de uso en MongoDB

Para poder usar esta característica en MongoDB necesitaremos:

  • MongoDB 4.0 o superior
  • ReplicaSet. Solo funciona sobre replicaSet, no en entornos standalone.
  • Todos los miembros del replicaSet tienen que tener el parámetro featureCompatibilityVersion con valor 4.0 o superior
  • Motor de base de datos WiredTiger
  • Los clientes necesitarán actualizar sus drivers a la versión 4.0
  • Cada transacción está asociadas a una sesión. Cuando trabajemos con los drivers, deberemos siempre pasarle la sesión y trabajar sobre la misma.

Veamos como hacerlo con MongoDB Shell, la consola nativa de MongoDB:

¿Cómo se usan las transacciones en MongoDB?

Las 3 opciones comandos disponibles para las transacciones son:

En cada transacción, deberemos tener un control sobre la misma independientemente del driver que usemos. Para ello, nos serviremos de try and catch. Un ejemplo sencillo sería el siguiente. Ejecuta la función txtFunc y en caso de que haya algún error y el error es transitorio, intenta realizar de nuevo 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) {
            print("Transaction aborted. Caught exception during transaction.");

            // If transient error, retry the whole transaction
            if ( error.hasOwnProperty("errorLabels") && error.errorLabels.includes( "TransientTransactionError")  ) {
                print("TransientTransactionError, retrying transaction ...");
                continue;
            } else {
                throw error;
            }
        }
    }
}

Para saber si el error es transitorio, deberá existir el array “errorLabels” y este contener el error “TransientTransactionError“. En el ejemplo anterior, con continue, intenta de nuevo la transacción. En caso de que se un error diferente, la transacción devolverá un error y no se realizará.

Esto es solo un ejemplo, podemos ver muchos más ejemplos con varios drivers en este enlace, así como toda la información oficial relativa a las transacciones.

Tal vez después de leer este artículo os animéis a migrar vuestro MySQL a MongoDB

Esperamos que os haya sido de utilidad,

Nos vemos en próximas entradas.