Z Wikipedie (která pro to má skvělé a podrobné příklady):
K neopakovatelnému čtení dochází, když je v průběhu transakce řádek načten dvakrát a hodnoty v řádku se mezi čteními liší.
a
K fantomovému čtení dochází, když jsou v průběhu transakce provedeny dva identické dotazy a kolekce řádků vrácených druhým dotazem se liší od prvního.
Jednoduché příklady:
- Uživatel A spustí stejný dotaz dvakrát.
- Mezitím provede uživatel B transakci a provede potvrzení.
- Neopakovatelné čtení:Řádek A, na který se uživatel A dotazoval, má podruhé jinou hodnotu.
- Fantomové čtení:Všechny řádky v dotazu mají stejnou hodnotu před a za, ale jsou vybírány různé řádky (protože B některé smazal nebo vložil). Příklad:
select sum(x) from table;
vrátí jiný výsledek, i když žádný z dotčených řádků nebyl aktualizován, pokud byly přidány nebo odstraněny řádky.
Jaká úroveň izolace se má ve výše uvedeném příkladu použít?
Jakou úroveň izolace potřebujete, závisí na vaší aplikaci. Existuje vysoké náklady na "lepší" úroveň izolace (jako je snížená souběžnost).
Ve vašem příkladu nebudete mít fiktivní čtení, protože vybíráte pouze z jednoho řádku (identifikovaného primárním klíčem). Můžete mít neopakovatelné čtení, takže pokud je to problém, možná budete chtít mít úroveň izolace, která tomu zabrání. V Oracle může transakce A také vydat SELECT FOR UPDATE, pak transakce B nemůže změnit řádek, dokud nebude A dokončena.