Multiversionado
La técnica de multiversionado (MVCC, por sus siglas en inglés) es una estrategia muy popular para gestionar la concurrencia en bases de datos, permitiendo que múltiples transacciones accedan a los datos de forma simultánea sin interferir entre sí.
¿Cómo funciona el Multiversionado?
En lugar de bloquear los datos cuando una transacción los está modificando, MVCC mantiene múltiples versiones de los mismos. Cada transacción "ve" la versión de los datos que era válida en el momento en que comenzó.
Aquí una explicación paso a paso:
- Creación de Versiones:
- Cada vez que un dato es modificado, se crea una nueva versión de ese dato. La versión anterior no se elimina, sino que se marca como "obsoleta".
- Lectura de Datos:
- Cuando una transacción necesita leer un dato, el sistema busca la versión más reciente de ese dato que sea válida para esa transacción. Esto significa que la versión debe haber sido creada antes de que la transacción comenzara y no debe haber sido marcada como obsoleta por ninguna transacción que se haya comprometido antes que esta.
- Escritura de Datos:
- Cuando una transacción necesita modificar un dato, se crea una nueva versión de ese dato con los cambios realizados. La versión anterior se marca como obsoleta.
Ejemplo:
Imagina una cuenta bancaria con un saldo inicial de 100 euros.
- Transacción T1: Lee el saldo (100 euros) y luego resta 50 euros.
- Transacción T2: Lee el saldo (100 euros) y luego suma 20 euros.
Sin MVCC: T2 tendría que esperar a que T1 termine para poder leer el saldo actualizado.
Con MVCC:
- T1 lee el saldo y crea una nueva versión con un saldo de 50 euros.
- T2 lee la versión anterior (100 euros) y crea una nueva versión con un saldo de 120 euros.
- Ambas transacciones se ejecutan sin interferir entre sí.
Ventajas del Multiversionado
- Alta Concurrencia: Permite que muchas transacciones se ejecuten simultáneamente sin bloquearse entre sí.
- Aislamiento de Lecturas: Las transacciones de lectura no bloquean a las transacciones de escritura, lo que mejora el rendimiento.
- Evita Deadlocks: Al no haber bloqueos, se reduce la posibilidad de que se produzcan deadlocks.
Desventajas del Multiversionado
- Mayor Consumo de Espacio: Se requiere más espacio de almacenamiento para mantener múltiples versiones de los datos.
- Complejidad: La implementación del MVCC puede ser más compleja que otros métodos de control de concurrencia.
¿Cuándo utilizar el Multiversionado?
- Bases de datos grandes con alta concurrencia: Donde es importante permitir que muchas transacciones se ejecuten simultáneamente.
- Aplicaciones que requieren un alto nivel de aislamiento: Donde es importante que las transacciones vean una vista consistente de los datos.
Algoritmo General del Multiversionado
1. Asignación de Timbre de Tiempo a la Transacción:
- Al inicio de una transacción, se le asigna un timbre de tiempo único. Este timbre de tiempo sirve como un identificador para la versión de los datos que la transacción "verá".
2. Lectura de Datos:
- Cuando una transacción necesita leer un dato, se busca la versión más reciente de ese dato que sea anterior al timbre de tiempo de la transacción. Esto garantiza que la transacción vea una versión consistente de los datos.
3. Escritura de Datos:
- Cuando una transacción necesita modificar un dato:
- Se crea una nueva versión del dato.
- Se actualiza el dato con los nuevos valores.
- Se asigna a esta nueva versión el timbre de tiempo de la transacción actual.
- La versión anterior se marca como obsoleta, pero no se elimina inmediatamente (para permitir que otras transacciones que aún no han comenzado puedan leerla).
4. Gestión de Versiones Obsoletas:
- Las versiones obsoletas se pueden eliminar periódicamente para liberar espacio, pero se debe garantizar que ninguna transacción activa las necesite.
Pseudo-código:
struct Version {
valor: any,
timbre_de_tiempo: int
}
struct Transaccion {
id: int,
timbre_de_tiempo: int
}
función leer_dato(transacción, dato)
versión = buscar_última_versión(dato) donde versión.timbre_de_tiempo < transacción.timbre_de_tiempo
return versión.valor
función escribir_dato(transacción, dato, nuevo_valor)
nueva_versión = Version(nuevo_valor, transacción.timbre_de_tiempo)
agregar_versión(dato, nueva_versión)
marcar_como_obsoleta(versión_anterior_de_dato)
función buscar_última_versión(dato)
// Busca en la lista de versiones del dato y devuelve la más reciente
// que sea anterior al timbre de tiempo de la transacción actual
función marcar_como_obsoleta(versión)
// Marca la versión como obsoleta
// Puede eliminar la versión después de un cierto tiempo o cuando se asegure
// que ninguna transacción activa la necesita
En resumen, el multiversionado es una técnica poderosa y eficiente para gestionar la concurrencia en bases de datos. Al permitir que múltiples transacciones accedan a diferentes versiones de los datos, se mejora significativamente el rendimiento y la escalabilidad del sistema.
Comentarios
Publicar un comentario