Sobes.tech
Middle+

Que anomalias podem ocorrer ao executar transações paralelas?

sobes.tech IA

Resposta da IA

Durante a execução paralela de transações, podem ocorrer as seguintes anomalias:

  1. Atualização perdida (Lost Update): Uma transação sobrescreve as alterações de outra transação antes de estas alterações serem confirmadas.

    Tempo Transação 1 Transação 2
    t1 Lê o valor do saldo (por exemplo, 100)
    t2 Lê o valor do saldo (por exemplo, 100)
    t3 Aumenta o saldo em 10 (Saldo = 110)
    t4 Aumenta o saldo em 20 (Saldo = 120)
    t5 Confirma as alterações (Saldo torna-se 110)
    t6 Confirma as alterações (Saldo torna-se 120)

    Resultado: Apesar de dois aumentos, o valor final do saldo é 120, não 130. A atualização da Transação 1 é perdida.

  2. Leitura suja (Dirty Read): Uma transação lê alterações não confirmadas de outra transação. Se a transação que fez as alterações for revertida, os dados lidos serão inválidos.

    Tempo Transação 1 Transação 2
    t1 Começa a alterar o saldo (100 -> 110)
    t2 Lê o saldo (obtém 110)
    t3 Reverte a alteração (o saldo volta a 100)
    t4 Usa o saldo = 110 nos cálculos, embora o valor real seja 100

    Resultado: A Transação 2 baseia suas ações em dados que, no final, não foram confirmados.

  3. Leitura não repetível (Non-Repeatable Read): Durante uma mesma transação, ao reler a mesma linha, obtêm-se valores diferentes porque outra transação confirmou alterações nessa linha entre as leituras.

    Tempo Transação 1 Transação 2
    t1 Lê o saldo (obtém 100)
    t2 Altera o saldo para 110 e confirma
    t3 Relê o saldo novamente (obtém 110 em vez de 100 esperado)

    Resultado: O saldo mudou dentro da mesma transação, o que pode levar a resultados incorretos.

  4. Leitura fantasma (Phantom Read): Semelhante à leitura não repetível, mas refere-se à adição ou remoção de linhas que afetam os resultados de uma consulta com predicado.

    Tempo Transação 1 Transação 2
    t1 Executa a consulta SELECT COUNT(*) FROM Orders WHERE Status = 'Pending' (obtém 5)
    t2 Adiciona uma nova ordem com status 'Pending' e confirma
    t3 Executa novamente SELECT COUNT(*) FROM Orders WHERE Status = 'Pending' (obtém 6)

    Resultado: Ao reexecutar a consulta, aparecem linhas "fantasma" que não estavam na primeira leitura.

Estas anomalias são evitadas pelo uso de diferentes níveis de isolamento de transações.