Sobes.tech
Middle+

¿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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.