От Уикипедия (която има страхотни и подробни примери за това):
Неповтарящо се четене възниква, когато по време на транзакция ред се извлича два пъти и стойностите в реда се различават между четенията.
и
Фантомно четене възниква, когато в хода на транзакция се изпълняват две идентични заявки и колекцията от редове, върната от втората заявка, е различна от първата.
Прости примери:
- Потребител А изпълнява една и съща заявка два пъти.
- Между това потребител Б изпълнява транзакция и извършва ангажименти.
- Неповтарящо се четене:Редът A, който потребител A е поискал, има различна стойност втори път.
- Фантомно четене:Всички редове в заявката имат една и съща стойност преди и след, но се избират различни редове (защото B е изтрил или вмъкнал някои). Пример:
select sum(x) from table;
ще върне различен резултат, дори ако нито един от засегнатите редове не е бил актуализиран, ако редовете са били добавени или изтрити.
В горния пример кое ниво на изолация да се използва?
Какво ниво на изолация ви е необходимо зависи от вашето приложение. Има висока цена за "по-добро" ниво на изолация (като намален паралелизъм).
Във вашия пример няма да имате фантомно четене, защото избирате само от един ред (идентифициран чрез първичен ключ). Можете да имате неповтаряеми четения, така че ако това е проблем, може да искате да имате ниво на изолация, което предотвратява това. В Oracle транзакция A може също да издаде SELECT FOR UPDATE, след което транзакция B не може да промени реда, докато A не е направено.