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