Was ist der Unterschied zwischen nicht wiederholbarem Lesen und Phantomlesen?
Ich habe den Artikel über Isolation (Datenbanksysteme) aus Wikipedia gelesen , habe aber einige Zweifel. Was passiert im folgenden Beispiel: das nicht wiederholbare Lesen und das Phantomlesen ?
Transaktion A.SELECT ID, USERNAME, accountno, amount FROM USERS WHERE ID=1
AUSGABE:
1----MIKE------29019892---------5000
Transaktion B.
UPDATE USERS SET amount=amount+5000 where ID=1 AND accountno=29019892;
COMMIT;
Transaktion A.
SELECT ID, USERNAME, accountno, amount FROM USERS WHERE ID=1
Ein weiterer Zweifel ist im obigen Beispiel, welche Isolationsstufe verwendet werden sollte. Und warum?
database
oracle
transactions
isolation-level
transaction-isolation
user1357722
quelle
quelle
Antworten:
Aus Wikipedia (mit großartigen und detaillierten Beispielen dafür):
und
Einfache Beispiele:
select sum(x) from table;
Gibt ein anderes Ergebnis zurück, auch wenn keine der betroffenen Zeilen selbst aktualisiert wurde, wenn Zeilen hinzugefügt oder gelöscht wurden.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 wird kein Phantom gelesen, da Sie nur aus einer einzelnen Zeile auswählen (gekennzeichnet durch den Primärschlüssel). Sie können nicht wiederholbare Lesevorgänge durchführen. Wenn dies ein Problem darstellt, möchten Sie möglicherweise eine Isolationsstufe, die dies verhindert. In Oracle kann Transaktion A auch SELECT FOR UPDATE ausgeben. Dann kann Transaktion B die Zeile erst ändern, wenn A fertig ist.
quelle
Eine einfache Art, wie ich darüber nachdenke, ist:
Sowohl nicht wiederholbare als auch Phantom-Lesevorgänge haben mit Datenänderungsvorgängen aus einer anderen Transaktion zu tun, die nach Beginn Ihrer Transaktion festgeschrieben und dann von Ihrer Transaktion gelesen wurden.
Nicht wiederholbare Lesevorgänge sind, wenn Ihre Transaktion festgeschriebene UPDATES von einer anderen Transaktion liest . Dieselbe Zeile hat jetzt andere Werte als zu Beginn Ihrer Transaktion.
Phantom-Lesevorgänge sind ähnlich, jedoch beim Lesen von festgeschriebenen INSERTS und / oder DELETES von einer anderen Transaktion. Es gibt neue Zeilen oder Zeilen, die seit Beginn der Transaktion verschwunden sind.
Dirty Reads ähneln nicht wiederholbaren und Phantom Reads, beziehen sich jedoch auf das Lesen von UNCOMMITTED-Daten und treten auf, wenn ein UPDATE, INSERT oder DELETE aus einer anderen Transaktion gelesen wird und die andere Transaktion die Daten noch NICHT festgeschrieben hat. Es werden "in Bearbeitung" -Daten gelesen, die möglicherweise nicht vollständig sind und möglicherweise nie festgeschrieben werden.
quelle
Wie in diesem Artikel erläutert , sieht die nicht wiederholbare Leseanomalie wie folgt aus:
In diesem Artikel über Phantom Read können Sie sehen, dass diese Anomalie wie folgt auftreten kann:
Während der nicht wiederholbare Lesevorgang für eine einzelne Zeile gilt, handelt es sich beim Phantom-Lesevorgang um einen Bereich von Datensätzen, die bestimmte Filterkriterien für Abfragen erfüllen.
quelle
Phänomene lesen
UPDATE
Abfrage einer anderen TransaktionINSERT
oder eineDELETE
Abfrage aus einer anderen TransaktionHinweis : DELETE-Anweisungen aus einer anderen Transaktion haben in bestimmten Fällen auch eine sehr geringe Wahrscheinlichkeit, nicht wiederholbare Lesevorgänge zu verursachen. Es passiert, wenn die DELETE-Anweisung leider dieselbe Zeile entfernt, die Ihre aktuelle Transaktion abgefragt hat. Dies ist jedoch ein seltener Fall und in einer Datenbank mit Millionen von Zeilen in jeder Tabelle weitaus unwahrscheinlicher. Tabellen mit Transaktionsdaten weisen normalerweise in jeder Produktionsumgebung ein hohes Datenvolumen auf.
Wir können auch beobachten, dass UPDATES in den meisten Anwendungsfällen häufiger auftreten als das tatsächliche INSERT oder DELETES (in solchen Fällen besteht nur die Gefahr nicht wiederholbarer Lesevorgänge - Phantom-Lesevorgänge sind in diesen Fällen nicht möglich). Aus diesem Grund werden UPDATES anders behandelt als INSERT-DELETE, und die resultierende Anomalie wird auch anders benannt.
Mit der Verarbeitung von INSERT-DELETEs sind zusätzliche Verarbeitungskosten verbunden, anstatt nur die UPDATES zu verarbeiten.
Vorteile unterschiedlicher Isolationsstufen
Warum setzen Sie dann nicht einfach die Transaktion SERIALIZABLE jederzeit? Nun, die Antwort auf die obige Frage lautet: Die Einstellung SERIALIZABLE macht Transaktionen sehr langsam , was wir wiederum nicht wollen.
Tatsächlich beträgt der Transaktionszeitverbrauch die folgende Rate:
Die Einstellung READ_UNCOMMITTED ist also die schnellste .
Zusammenfassung
Tatsächlich müssen wir den Anwendungsfall analysieren und eine Isolationsstufe festlegen , um die Transaktionszeit zu optimieren und die meisten Anomalien zu vermeiden.
Beachten Sie, dass Datenbanken standardmäßig die Einstellung REPEATABLE_READ haben.
quelle
Es gibt einen Unterschied in der Implementierung zwischen diesen beiden Arten von Isolationsstufen.
Für "nicht wiederholbares Lesen" ist eine Zeilensperrung erforderlich.
Für "Phantom Read" , ist eine Bereichsschließung erforderlich, sogar eine Tabellensperre.
Wir können diese beiden Ebenen mithilfe des Zwei-Phasen-Verriegelungsprotokolls implementieren .
quelle
In einem System mit nicht wiederholbaren Lesevorgängen spiegelt das Ergebnis der zweiten Abfrage von Transaktion A die Aktualisierung in Transaktion B wider - es wird der neue Betrag angezeigt.
In einem System , das ermöglicht phantom liest, wenn Transaktion B waren einzufügen eine neue Zeile mit ID = 1, A Transaktion sieht die neue Zeile , wenn die zweite Abfrage ausgeführt wird ; dh Phantom-Lesevorgänge sind ein Sonderfall des nicht wiederholbaren Lesens.
quelle
Die akzeptierte Antwort zeigt vor allem, dass die sogenannte Unterscheidung zwischen den beiden tatsächlich überhaupt nicht signifikant ist.
Wenn "eine Zeile zweimal abgerufen wird und sich die Werte in der Zeile zwischen den Lesevorgängen unterscheiden", dann sind sie nicht dieselbe Zeile (nicht dasselbe Tupel in korrekter RDB-Sprache), und es ist dann per Definition auch der Fall, dass "die Sammlung von Von der zweiten Abfrage zurückgegebene Zeilen unterscheiden sich von der ersten ".
In Bezug auf die Frage "Welche Isolationsstufe sollte verwendet werden" gilt: Je wichtiger Ihre Daten für jemanden von entscheidender Bedeutung sind, desto mehr ist Serializable Ihre einzig vernünftige Option.
quelle
Ich denke, es gibt einen Unterschied zwischen nicht wiederholbarem Lesen und Phantomlesen.
Das nicht wiederholbare Mittel bedeutet, dass zwei Transaktionen A und B vorliegen. Wenn B die Änderung von A bemerken kann, kann dies zu einem Dirty-Read führen, sodass B die Änderung von A nach dem Festschreiben von A bemerkt.
Es gibt ein neues Problem: Wir lassen B die Änderung von A nach dem Festschreiben von A bemerken. Dies bedeutet, dass A einen Wert der Zeile ändert, die B hält. Manchmal liest B die Zeile erneut, sodass B beim ersten Mal einen neuen Wert erhält get, wir nennen es nicht wiederholbar, um das Problem zu lösen, lassen wir das B sich an etwas erinnern (weil ich noch nicht weiß, woran man sich erinnern wird), wenn B anfängt.
Lassen Sie uns über die neue Lösung nachdenken. Wir können feststellen, dass es auch ein neues Problem gibt, da wir B an etwas erinnern lassen. Was auch immer in A passiert ist, das B kann nicht beeinflusst werden, aber wenn B einige Daten in Tabelle und B einfügen möchte Überprüfen Sie die Tabelle, um sicherzustellen, dass kein Datensatz vorhanden ist. Diese Daten wurden jedoch von A eingefügt. Daher kann möglicherweise ein Fehler auftreten. Wir nennen es Phantom-Read.
quelle
Das nicht wiederholbare Lesen ist eine Isolationsstufe, und das Phantomlesen (Lesen des festgeschriebenen Werts durch andere Transaktionen) ist ein Konzept (Art des Lesens, z. B. Dirty Read oder Snapshot Read). Die nicht wiederholbare Leseisolationsstufe ermöglicht Phantom-Lesevorgänge, jedoch keine Dirty-Reads oder Snapshot-Reads.
quelle