¿Qué anomalías pueden ocurrir durante la ejecución de transacciones paralelas?
sobes.tech AI
Respuesta de la IA
Durante la ejecución paralela de transacciones, pueden ocurrir las siguientes anomalías:
-
Actualización perdida (Lost Update): Una transacción sobrescribe los cambios de otra transacción antes de que estos cambios hayan sido confirmados.
Tiempo Transacción 1 Transacción 2 t1 Lee el valor del saldo (por ejemplo, 100) t2 Lee el valor del saldo (por ejemplo, 100) t3 Aumenta el saldo en 10 (Saldo = 110) t4 Aumenta el saldo en 20 (Saldo = 120) t5 Confirma los cambios (Saldo se vuelve 110) t6 Confirma los cambios (Saldo se vuelve 120) Resultado: A pesar de dos aumentos, el valor final del saldo es 120, no 130. La actualización de la Transacción 1 se pierde.
-
Lectura sucia (Dirty Read): Una transacción lee cambios no confirmados de otra transacción. Si la transacción que hizo los cambios se revierte, los datos leídos serán inválidos.
Tiempo Transacción 1 Transacción 2 t1 Comienza a cambiar el saldo (100 -> 110) t2 Lee el saldo (obtiene 110) t3 Revierte el cambio (el saldo vuelve a 100) t4 Usa el saldo = 110 en cálculos, aunque el valor real es 100 Resultado: La Transacción 2 basa sus acciones en datos que en última instancia no fueron confirmados.
-
Lectura no repetible (Non-Repeatable Read): Durante una misma transacción, al volver a leer la misma fila, se obtienen valores diferentes porque otra transacción ha confirmado cambios en esa fila entre las lecturas.
Tiempo Transacción 1 Transacción 2 t1 Lee el saldo (obtiene 100) t2 Cambia el saldo a 110 y confirma t3 Vuelve a leer el saldo (obtiene 110 en lugar de 100 esperado) Resultado: El saldo cambió dentro de la misma transacción, lo que puede llevar a resultados incorrectos.
-
Lectura fantasma (Phantom Read): Similar a la lectura no repetible, pero se refiere a la adición o eliminación de filas que afectan los resultados de una consulta con predicado.
Tiempo Transacción 1 Transacción 2 t1 Ejecuta la consulta SELECT COUNT(*) FROM Orders WHERE Status = 'Pending'(obtiene 5)t2 Añade una nueva orden con estado 'Pending' y confirma t3 Ejecuta nuevamente SELECT COUNT(*) FROM Orders WHERE Status = 'Pending'(obtiene 6)Resultado: Al volver a ejecutar la consulta, aparecen filas "fantasma" que no estaban en la primera lectura.
Estas anomalías se previenen mediante el uso de diferentes niveles de aislamiento de transacciones.