Da Wikipedia (che ha ottimi e dettagliati esempi per questo):
Una lettura non ripetibile si verifica quando, nel corso di una transazione, una riga viene recuperata due volte e i valori all'interno della riga differiscono tra le letture.
e
Una lettura fantasma si verifica quando, nel corso di una transazione, vengono eseguite due query identiche e la raccolta di righe restituite dalla seconda query è diversa dalla prima.
Esempi semplici:
- L'utente A esegue la stessa query due volte.
- Nel frattempo, l'utente B esegue una transazione e si impegna.
- Lettura non ripetibile:la riga A che l'utente A ha interrogato ha un valore diverso la seconda volta.
- Lettura fantasma:tutte le righe nella query hanno lo stesso valore prima e dopo, ma vengono selezionate righe diverse (perché B ne ha cancellati o inseriti alcuni). Esempio:
select sum(x) from table;
restituirà un risultato diverso anche se nessuna delle righe interessate è stata aggiornata, se sono state aggiunte o eliminate righe.
Nell'esempio precedente, quale livello di isolamento utilizzare?
Il livello di isolamento necessario dipende dall'applicazione. C'è un costo elevato per un livello di isolamento "migliore" (come una minore concorrenza).
Nel tuo esempio, non avrai una lettura fantasma, perché selezioni solo da una singola riga (identificata dalla chiave primaria). Puoi avere letture non ripetibili, quindi se questo è un problema, potresti voler avere un livello di isolamento che lo impedisca. In Oracle, la transazione A potrebbe anche emettere un SELECT FOR UPDATE, quindi la transazione B non può modificare la riga finché A non è terminato.