Versionado Optimista
Versionado Optimista: Una Visión Optimista de las Transacciones
Si imaginamos el bloqueo como un sistema de reservas muy estricto, el versionado optimista es como un sistema de autopréstamo de confianza. En lugar de reservar un libro antes de leerlo, asumes que nadie más lo modificará mientras tú lo estás leyendo. Solo al finalizar la lectura, compruebas si alguien ha hecho cambios.
¿Cómo funciona?
- Lectura sin bloqueo: Cuando una transacción necesita leer o modificar un dato, lo hace sin adquirir ningún bloqueo. Es decir, lee la versión actual del dato en ese momento.
- Escritura tentativa: Los cambios se realizan sobre una copia local de los datos.
- Validación: Al finalizar la transacción, se compara la versión original de los datos con la versión actual. Si no ha habido cambios, la transacción se confirma y los cambios se aplican a la base de datos. Si ha habido cambios, la transacción aborta y se debe volver a iniciar.
Ventajas del Versionado Optimista
- Alto rendimiento: Al evitar los bloqueos, se reduce la contención y se mejora el rendimiento del sistema.
- Escalabilidad: Es ideal para sistemas distribuidos y de alta concurrencia.
Desventajas del Versionado Optimista
- Mayor tasa de abortos: Si hay muchos conflictos, la tasa de abortos puede ser alta, lo que puede llevar a una disminución del rendimiento.
- Mayor complejidad: La implementación del versionado optimista es más compleja que la del bloqueo.
¿Cuándo utilizar el versionado optimista?
- Aplicaciones de alta concurrencia: Donde se espera un gran número de transacciones simultáneas.
- Aplicaciones donde los conflictos son poco frecuentes: Si la probabilidad de que dos transacciones modifiquen los mismos datos al mismo tiempo es baja.
Comparación con el Bloqueo
| Característica | Bloqueo | Versionado Optimista |
|---|---|---|
| Concurrencia | Baja | Alta |
| Rendimiento | Puede ser bajo si hay muchos bloqueos | Alto |
| Complejidad | Baja | Alta |
| Tasa de abortos | Baja | Puede ser alta |
Ejemplo:
Imagina que tienes dos cuentas bancarias, una de ahorros y otra corriente. Quieres transferir 100 euros de la cuenta de ahorros a la corriente.
Versionado optimista en acción:
-
Lectura sin bloqueo:
- El sistema lee el saldo actual de ambas cuentas. Supongamos que la cuenta de ahorros tiene 500 euros y la corriente 200 euros.
-
Escritura tentativa:
- El sistema realiza los cambios en una copia local de los datos:
- Resta 100 euros a la copia del saldo de la cuenta de ahorros (quedando en 400 euros).
- Suma 100 euros a la copia del saldo de la cuenta corriente (quedando en 300 euros).
- El sistema realiza los cambios en una copia local de los datos:
-
Validación:
- El sistema vuelve a leer los saldos actuales de ambas cuentas en la base de datos.
- Caso 1: No ha habido cambios: Si los saldos coinciden con los que leyó al principio, significa que ninguna otra transacción ha modificado las cuentas en el ínterin. En este caso, el sistema confirma la transacción y actualiza los saldos en la base de datos con los valores de la copia local.
- Caso 2: Ha habido cambios: Si algún otro usuario ha retirado o depositado dinero en alguna de las cuentas mientras se realizaba la transacción, los saldos actuales no coincidirán con los leídos al principio. En este caso, la transacción se aborta. Esto significa que el usuario tendrá que intentar realizar la transferencia nuevamente.
¿Por qué se aborta la transacción en el caso 2?
Si se permitiera confirmar la transacción a pesar de que otros usuarios han modificado las cuentas, podría producirse una inconsistencia en los datos. Por ejemplo, si otro usuario ha retirado 50 euros de la cuenta de ahorros mientras se realizaba la transferencia, al confirmar la transacción se estaría restando 100 euros a un saldo que ya es inferior en 50 euros, lo que llevaría a un saldo negativo.
Algoritmo General para Versionado Optimista:
-
Inicio de Transacción:
- Asignar un identificador único a la transacción.
- Crear una copia local de los datos que se van a modificar.
-
Lectura de Datos:
- Leer los valores actuales de los datos que se necesitan modificar y guardarlos en la copia local.
-
Modificación de Datos:
- Realizar los cambios necesarios en la copia local de los datos.
-
Validación de Transacción:
- Volver a leer los valores actuales de los datos en la base de datos.
- Comparar los valores leídos con los valores originales guardados en la copia local.
- Si no hay diferencias, la transacción es válida y se procede al siguiente paso.
- Si hay diferencias, la transacción aborta y se debe volver a iniciar.
-
Confirmación de Transacción:
- Si la validación fue exitosa, se aplican los cambios de la copia local a la base de datos, reemplazando los valores antiguos por los nuevos.
-
Fin de Transacción:
- Liberar los recursos utilizados por la transacción.
Ejemplo en pseudo-código:
función versionado_optimista(transacción)
identificador_transacción = generar_identificador()
copia_local = leer_datos(transacción.datos_a_modificar)
// Modificar la copia local
modificar_datos(copia_local)
valores_actuales = leer_datos(transacción.datos_a_modificar)
si valores_actuales == copia_local.valores_originales
escribir_datos(copia_local)
return ÉXITO
sino
return FALLO
fin_si
fin_función
Consideraciones Importantes:
- Identificador de Transacción: Se utiliza para rastrear la transacción y detectar conflictos.
- Copia Local: Es esencial para realizar los cambios sin afectar los datos originales hasta que se confirme la transacción.
- Validación: La comparación entre los valores leídos y los originales es crucial para garantizar la consistencia de los datos.
- Confirmación: Si la validación es exitosa, se deben aplicar los cambios de manera atómica para evitar que otra transacción interfiera.
- Aborto: Si la validación falla, la transacción debe abortarse y se debe informar al usuario o al sistema.
En resumen, el versionado optimista es una técnica muy útil para mejorar el rendimiento de las bases de datos en entornos de alta concurrencia, pero es importante evaluar cuidadosamente si es la mejor opción para tu aplicación, ya que puede aumentar la tasa de abortos si los conflictos son frecuentes.
Comentarios
Publicar un comentario