Heim  >  Artikel  >  Datenbank  >  Vertiefendes Verständnis der 4 Arten von Isolationsstufen in MySQL

Vertiefendes Verständnis der 4 Arten von Isolationsstufen in MySQL

零下一度
零下一度Original
2017-04-27 09:18:591297Durchsuche


Der SQL-Standard definiert 4 Arten von Isolationsstufen, einschließlich einiger spezifischer Regeln, um einzuschränken, welche Änderungen innerhalb und außerhalb der Transaktion sichtbar und welche unsichtbar sind. Niedrigere Isolationsstufen unterstützen im Allgemeinen eine höhere Parallelität und haben einen geringeren Systemaufwand.

Nicht festgeschriebenen Inhalt lesen (Nicht festgeschriebenen Inhalt lesen)

Auf dieser Isolationsstufe sind alle Transaktionen sichtbar. Die Ausführungsergebnisse anderer nicht festgeschriebener Transaktionen. Diese Isolationsstufe wird in praktischen Anwendungen selten verwendet, da ihre Leistung nicht viel besser ist als die anderer Stufen. Das Lesen nicht festgeschriebener Daten wird auch als Dirty Read bezeichnet.
Read Committed

Dies ist die Standardisolationsstufe für die meisten Datenbanksysteme (jedoch nicht die MySQL-Standardeinstellung). Es erfüllt die einfache Definition von Isolation: Eine Transaktion kann nur Änderungen sehen, die von festgeschriebenen Transaktionen vorgenommen wurden. Diese Isolationsstufe unterstützt auch das sogenannte nicht wiederholbare Lesen, da andere Instanzen derselben Transaktion während der Verarbeitung der Instanz möglicherweise neue Commits haben, sodass dieselbe Auswahl möglicherweise unterschiedliche Ergebnisse zurückgibt.
Wiederholbares Lesen (wiederholbar)

Dies ist die standardmäßige Transaktionsisolationsstufe von MySQL, die sicherstellt, dass mehrere Instanzen derselben Transaktion gleichzeitig Daten lesen können. , sehen Sie dieselben Datenzeilen. Theoretisch führt dies jedoch zu einem weiteren heiklen Problem: Phantom Read (Phantom Read). Einfach ausgedrückt bedeutet Phantomlesen, dass, wenn der Benutzer einen bestimmten Bereich von Datenzeilen liest, eine andere Transaktion eine neue Zeile in den Bereich einfügt. Wenn der Benutzer die Datenzeilen im Bereich erneut liest, wird er feststellen, dass es neue „Phantome“ gibt. OK. InnoDB- und Falcon-Speicher-Engines lösen dieses Problem durch den Multiversion-Parallelitätskontrollmechanismus (MVCC, Multiversion Concurrency Control).

Serialisierbar
Dies ist die höchste Isolationsstufe und wird dadurch gelöst, dass Transaktionen so angeordnet werden müssen, dass sie nicht miteinander in Konflikt geraten können. Kurz gesagt, es fügt jeder gelesenen Datenzeile eine gemeinsame Sperre hinzu. Auf dieser Ebene kann es zu zahlreichen Zeitüberschreitungen und Sperrkonflikten kommen.

Diese vier Isolationsstufen werden mithilfe unterschiedlicher Sperrtypen implementiert. Wenn dieselben Daten gelesen werden, kann es leicht zu Problemen kommen. Beispiel:

Dirty Read: Eine Transaktion hat ein Datenelement aktualisiert, und eine andere Transaktion hat zu diesem Zeitpunkt dieselben Daten gelesen. Aus irgendeinem Grund ist der vorherige Vorgang ein RollBack , sind die von der letztgenannten Transaktion gelesenen Daten falsch.

Nicht wiederholbares Lesen: Die Daten sind zwischen zwei Abfragen einer Transaktion inkonsistent. Dies kann daran liegen, dass die Originaldaten durch eine zwischen den beiden Abfragen eingefügte Transaktion aktualisiert wurden.

Phantom Read: Die Anzahl der Datenelemente in zwei Abfragen einer Transaktion ist inkonsistent. Beispielsweise fragt eine Transaktion mehrere Datenzeilen ab, während eine andere Transaktion zu diesem Zeitpunkt mehrere neue abfragt In der nachfolgenden Abfrage der vorherigen Transaktion werden Sie feststellen, dass es mehrere Datenspalten gibt, die zuvor nicht vorhanden waren.

In MySQL sind diese vier Isolationsstufen implementiert, die folgende Probleme verursachen können:


Als Nächstes verwenden wir das MySQL-Clientprogramm, um mehrere Isolationsstufen zu testen. Die Testdatenbank ist test und die Tabelle ist tx; Tabellenstruktur:

id                               int

num

                              int
id                                        int

num

                                                                                                int >

Die beiden Befehlszeilen-Clients A und B ändern ständig die Isolationsstufe von A und ändern die Daten auf der B-Seite.

(1) Stellen Sie die Isolationsstufe von A so ein, dass sie nicht festgeschrieben (nicht festgeschrieben) liest

in B Vor Daten wird aktualisiert:

Kunde A:

B aktualisierte Daten:

Kunde B:

Kunde A:

Nach dem obigen Experiment kann der Schluss gezogen werden, dass Transaktion B einen Datensatz aktualisiert hat, dieser jedoch nicht übermittelt wurde. Zu diesem Zeitpunkt kann Transaktion A den nicht festgeschriebenen Datensatz abfragen. Ursache für Dirty Reads. „Read uncommitted“ ist die niedrigste Isolationsstufe.

(2) Stellen Sie die Transaktionsisolationsstufe von Client A auf „Read Committed“ ein, bevor B die Daten aktualisiert hat :

Kunde A:

B Aktualisierungsdaten:

Kunde B:

Kunde A:

Nach dem obigen Experiment kann der Schluss gezogen werden, dass die festgeschriebene Leseisolationsstufe das Problem des schmutzigen Lesens löst, jedoch das Problem des nicht wiederholbaren Lesens Dies bedeutet, dass die von Transaktion A zwischen den beiden Abfragen abgefragten Daten inkonsistent sind, da Transaktion B zwischen den beiden Abfragen ein Datenelement aktualisiert hat. Committed Read ermöglicht nur das Lesen von Committed-Datensätzen, erfordert jedoch keine wiederholbaren Lesevorgänge.

(3),

Setzen Sie die Isolationsstufe von A auf wiederholbares Lesen (wiederholbares Lesen)

in B Vorher Daten werden aktualisiert:

Kunde A:

B Daten aktualisieren:

Kunde B:

Kunde A:

B fügt Daten ein:

Kunde B:

Kunde A:

Basierend auf dem obigen Experiment kann es sein kam zu dem Schluss, dass die wiederholbare Leseisolationsstufe nur das Lesen von festgeschriebenen Datensätzen zulässt und dass während des Zeitraums, in dem eine Transaktion einen Datensatz zweimal liest, andere Transaktionen den Datensatz aktualisieren. Die Transaktion muss jedoch nicht mit anderen Transaktionen serialisierbar sein. Wenn eine Transaktion beispielsweise Datensätze findet, die durch eine festgeschriebene Transaktion aktualisiert wurden, können Phantomleseprobleme auftreten (beachten Sie, dass dies möglich ist, weil die Datenbank Isolationsstufen unterschiedlich implementiert). Bei Experimenten wie den oben genannten besteht kein Problem des Phantomlesens von Daten.

(vier), Setzen Sie die Isolationsstufe von A auf Serialisierbar

A-Seite öffnet die Transaktion und B-Seite fügt einen Datensatz ein

Transaktion A-Seite:

Transaktion B-Seite:

Weil Die Isolationsstufe von Transaktion A ist zu diesem Zeitpunkt auf serialisierbar eingestellt. Nach dem Start der Transaktion wird sie nicht festgeschrieben, sodass Transaktion B nur warten kann.

Transaktion A schreibt die Transaktion fest:

Seite der Transaktion A

Transaktion B-Seite

 

Serializable sperrt das Feld vollständig. Wenn eine Transaktion dieselben Daten abfragt, muss sie warten, bis die vorherige Transaktion abgeschlossen ist und die Sperre aufhebt . ist eine vollständige Isolationsstufe und sperrt die entsprechende Datentabelle, sodass es zu Effizienzproblemen kommt.

Das obige ist der detaillierte Inhalt vonVertiefendes Verständnis der 4 Arten von Isolationsstufen in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn