Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Qual é a diferença entre leitura não repetível e leitura fantasma?


Da Wikipedia (que tem exemplos ótimos e detalhados para isso):

Uma leitura não repetível ocorre quando, durante o curso de uma transação, uma linha é recuperada duas vezes e os valores dentro da linha diferem entre as leituras.

e

Uma leitura fantasma ocorre quando, no decorrer de uma transação, duas consultas idênticas são executadas e a coleção de linhas retornada pela segunda consulta é diferente da primeira.

Exemplos simples:
  • O usuário A executa a mesma consulta duas vezes.
  • No meio, o usuário B executa uma transação e confirma.
  • Leitura não repetível:a linha A consultada pelo usuário A tem um valor diferente na segunda vez.
  • Leitura fantasma:todas as linhas na consulta têm o mesmo valor antes e depois, mas linhas diferentes estão sendo selecionadas (porque B excluiu ou inseriu alguns). Exemplo:select sum(x) from table; retornará um resultado diferente mesmo que nenhuma das linhas afetadas tenha sido atualizada, se as linhas foram adicionadas ou excluídas.

No exemplo acima, qual nível de isolamento deve ser usado?

O nível de isolamento necessário depende do seu aplicativo. Há um alto custo para um nível de isolamento "melhor" (como simultaneidade reduzida).

No seu exemplo, você não terá uma leitura fantasma, porque você seleciona apenas de uma única linha (identificada pela chave primária). Você pode ter leituras não repetíveis, portanto, se isso for um problema, convém ter um nível de isolamento que impeça isso. No Oracle, a transação A também pode emitir um SELECT FOR UPDATE, então a transação B não pode alterar a linha até que A seja concluída.