Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Was ist der Unterschied zwischen Non-Repeatable Read und Phantom Read?

Aus Wikipedia (das großartige und detaillierte Beispiele dafür hat):

Ein nicht wiederholbarer Lesevorgang tritt auf, wenn im Verlauf einer Transaktion eine Zeile zweimal abgerufen wird und die Werte innerhalb der Zeile zwischen den Lesevorgängen unterschiedlich sind.

und

Ein Phantomlesevorgang tritt auf, wenn im Verlauf einer Transaktion zwei identische Abfragen ausgeführt werden und die Sammlung von Zeilen, die von der zweiten Abfrage zurückgegeben wird, sich von der ersten unterscheidet.

Einfache Beispiele:

  • Benutzer A führt dieselbe Abfrage zweimal aus.
  • Zwischendurch führt Benutzer B eine Transaktion aus und schreibt fest.
  • Nicht wiederholbares Lesen:Die A-Zeile, die Benutzer A abgefragt hat, hat beim zweiten Mal einen anderen Wert.
  • Phantom lesen:Alle Zeilen in der Abfrage haben den gleichen Wert davor und danach, aber es werden unterschiedliche Zeilen ausgewählt (weil B einige gelöscht oder eingefügt hat). Beispiel:select sum(x) from table; gibt ein anderes Ergebnis zurück, selbst wenn keine der betroffenen Zeilen selbst aktualisiert wurden, wenn Zeilen hinzugefügt oder gelöscht wurden.

Welche Isolationsstufe soll im obigen Beispiel verwendet werden?

Welche Isolationsstufe Sie benötigen, hängt von Ihrer Anwendung ab. Eine "bessere" Isolationsstufe (z. B. reduzierte Parallelität) ist mit hohen Kosten verbunden.

In Ihrem Beispiel haben Sie keinen Phantomlesevorgang, da Sie nur aus einer einzelnen Zeile auswählen (identifiziert durch den Primärschlüssel). Sie können nicht wiederholbare Lesevorgänge haben. Wenn dies ein Problem darstellt, möchten Sie möglicherweise eine Isolationsstufe haben, die dies verhindert. In Oracle könnte Transaktion A auch ein SELECT FOR UPDATE ausgeben, dann kann Transaktion B die Zeile nicht ändern, bis A fertig ist.