sql >> Database teknologi >  >> RDS >> Oracle

Hvad er forskellen mellem Non-Repeatable Read og Phantom Read?

Fra Wikipedia (som har gode og detaljerede eksempler på dette):

En ikke-gentagelig læsning forekommer, når en række i løbet af en transaktion hentes to gange, og værdierne i rækken er forskellige fra læsninger.

og

En fantomlæsning opstår, når der i løbet af en transaktion udføres to identiske forespørgsler, og samlingen af ​​rækker, der returneres af den anden forespørgsel, er forskellig fra den første.

Simple eksempler:

  • Bruger A kører den samme forespørgsel to gange.
  • I mellemtiden kører bruger B en transaktion og forpligter sig.
  • Ikke-gentagelig læsning:A-rækken, som bruger A har forespurgt, har en anden værdi anden gang.
  • Phantom read:Alle rækkerne i forespørgslen har samme værdi før og efter, men forskellige rækker vælges (fordi B har slettet eller indsat nogle). Eksempel:select sum(x) from table; vil returnere et andet resultat, selvom ingen af ​​de berørte rækker selv er blevet opdateret, hvis rækker er blevet tilføjet eller slettet.

I ovenstående eksempel, hvilket isolationsniveau skal bruges?

Hvilket isolationsniveau du har brug for afhænger af din applikation. Der er høje omkostninger ved et "bedre" isolationsniveau (såsom reduceret samtidighed).

I dit eksempel vil du ikke have en fantomlæsning, fordi du kun vælger fra en enkelt række (identificeret med primærnøgle). Du kan have læsninger, der ikke kan gentages, så hvis det er et problem, vil du måske have et isolationsniveau, der forhindrer det. I Oracle kunne transaktion A også udstede en SELECT FOR UPDATE, så kan transaktion B ikke ændre rækken, før A er færdig.



  1. Grupperet LIMIT i PostgreSQL:vis de første N rækker for hver gruppe?

  2. PGLogical 1.1-pakker til PostgreSQL 9.6beta1

  3. SQL Server Query Store

  4. Brugerdefinerede grafer til at overvåge dine MySQL-, MariaDB-, MongoDB- og PostgreSQL-systemer - ClusterControl Tips &Tricks