Vorwort Im vorherigen Artikel „Detaillierte Erklärung des MySQL-Sperrmechanismus“ haben wir den Sperrmechanismus von InnoDB ausführlich erklärt. Der Sperrmechanismus wird verwendet, um die Genauigkeit der Daten in gleichzeitigen Situationen sicherzustellen. Um die Datengenauigkeit sicherzustellen, sind normalerweise Transaktionen erforderlich. Die MySQL-Speicher-Engine InnoDB implementiert die vier Isolationsebenen in den Isolationseigenschaften von Transaktionen geschickt durch den Sperrmechanismus. Transaktions-ACID-Eigenschaften, wobei I für Isolation steht. Isolation bedeutet, dass bei gleichzeitigen Transaktionen mehrerer Benutzer, die auf dieselbe Datenbank zugreifen, die Transaktion eines Benutzers nicht durch die Transaktionen anderer Benutzer gestört werden darf und mehrere gleichzeitige Transaktionen voneinander isoliert sein müssen. Wir alle kennen die Eigenschaften von Transaktionen. Konsistenz und Isolation in der Datenbank sind die Grundideen für die Implementierung von Transaktionen. Wenn das System eine große Anzahl gleichzeitiger Zugriffe aufweist, spielt das Verständnis und die geschickte Anwendung der eigenen Transaktionsisolierungsebene der Datenbank eine Schlüsselrolle beim Schreiben von robustem Code mit starken gleichzeitigen Verarbeitungsfunktionen. 1. Wie Transaktionen sich gegenseitig beeinflussen Wie stört eine Transaktion andere Transaktionen? Beispielsweise gibt es folgende Tabelle: Tabelle erstellen lock_example(id smallint(10),name varchar(20),Primärschlüssel-ID)engine=innodb; Die Tabelle enthält folgende Daten:
Demo1: Transaktion A wird zuerst ausgeführt und befindet sich in einem nicht festgeschriebenen Zustand: in t-Werte einfügen (4, „zhaoliu“); Auch die später ausgeführte Transaktion B wird nicht festgeschrieben: wähle * aus t; Wenn Transaktion B den Datensatz lesen kann (4, zhaoliu), bedeutet dies, dass Transaktion A Auswirkungen auf Transaktion B hat. Diese Auswirkung wird als "Dirty Read" bezeichnet, dh der Datensatz nicht festgeschriebener Transaktionsvorgänge wird gelesen. Demo 2: Transaktion A, zuerst ausführen: wähle * aus t, wobei ID=1; Der Ergebnissatz ist
Transaktion B wird später ausgeführt und festgeschrieben: aktualisiere t setze Name=xxx, wobei ID=1 ist; begehen; Transaktion A führt dieselbe Abfrage erneut aus: wähle * aus t, wobei ID=1; Der Ergebnisset ist:
Dieses Mal hat die festgeschriebene Transaktion B Auswirkungen auf die Transaktion A. Diese Auswirkung wird als „nicht wiederholbares Lesen“ bezeichnet, d. h., die gleiche Abfrage innerhalb einer Transaktion führt zu unterschiedlichen Ergebnissen. Demo 3: Transaktion A, zuerst ausführen: wähle * aus t, wo ID > 3; Der Ergebnisset ist:
Transaktion B wird später ausgeführt und festgeschrieben: in t-Werte einfügen (4, zhaoliu); begehen; Transaktion A fragt zuerst nach einer ID>3 und das Ergebnis ist NULL, daher möchte sie einen Datensatz mit der ID 4 einfügen: in t-Werte einfügen (4, xxoo); Der Ergebnisset ist:
Sie denken vielleicht: . . Willst du mich verarschen? Ich habe es geprüft und es war ein leerer Satz, wenn ID>3, aber als ich ID=4 eingefügt habe, wurde mir angezeigt, dass ein PK-Konflikt vorliegt? →_→ Dieses Mal wird die Auswirkung der festgeschriebenen Transaktion B auf Transaktion A als „Phantomlesen“ bezeichnet. Wie oben erwähnt, können gleichzeitige Transaktionen bei anderen Transaktionen zu Dirty Reads, nicht wiederholbaren Reads und Phantom Reads führen. Welche Anstrengungen hat InnoDB unternommen, um die oben genannte Situation zu vermeiden? 2. Welche Transaktionsisolationsebenen implementiert InnoDB? InnoDB implementiert vier verschiedene Transaktionsisolationsebenen:
Die Isolationsstufe verschiedener Transaktionen ist eigentlich ein Kompromiss zwischen Konsistenz und Parallelität. 3. Wie implementiert man die vier Transaktionsisolationsebenen in InnoDB? InnoDB verwendet verschiedene Sperrstrategien, um unterschiedliche Isolationsebenen zu implementieren. a. Nicht festgeschriebene Daten lesen Auf dieser Transaktionsisolationsebene führt die Select-Anweisung nicht zu einer Sperre und stellt keinen Snapshot-Lesevorgang dar. SELECT-Anweisungen werden ohne Sperren ausgeführt. Zu diesem Zeitpunkt werden möglicherweise inkonsistente Daten gelesen, was als „Dirty Read“ bezeichnet wird. Dies ist die Isolationsebene mit der höchsten Parallelität und der schlechtesten Konsistenz. b. Lesen Sie festgeschrieben (RC)
Zu diesem Zeitpunkt kann die Einfügung anderer Transaktionen noch ausgeführt werden, was dazu führen kann, dass Phantomdatensätze gelesen werden. Diese Ebene wird am häufigsten verwendet. Und wenn es sich um eine nicht gesperrte Auswahl handelt, kann es zu einem nicht wiederholbaren Lesevorgang kommen. Auf dieser Ebene werden Dirty Reads durch Snapshot-Reads verhindert. Da Snapshot-Lesevorgänge auf dieser Ebene immer den neuesten Zeilendaten-Snapshot lesen können, muss dieser natürlich durch eine festgeschriebene Transaktion geschrieben werden, sodass nicht wiederholbare Lesevorgänge auftreten können. c. Wiederholbares Lesen (RR) Dies ist die Standardisolationsebene von InnoDB unter RR:
Auf dieser Ebene
Serialisierbar Auf dieser Transaktionsisolationsebene werden alle Select-Anweisungen implizit in Select ... im Share-Modus umgewandelt, was bedeutet, dass standardmäßig eine gemeinsame Lesesperre (S-Sperre) gesetzt ist. Wenn Transaktion A also zuerst die folgende SQL-Anweisung ausführt, versucht sie, die IS-Sperre der abgefragten Zeile zu erhalten (die mit anderen IS- und IX-Sperren kompatibel ist). Zu diesem Zeitpunkt können auch andere Transaktionen die IS-Sperre oder sogar die S-Sperre dieser Zeilen erhalten. Wenn Transaktion A jedoch als nächstes einige der Zeilen aktualisiert oder löscht, erhält sie die X-Sperre. Andere Transaktionen werden blockiert, selbst wenn sie normale Select-Anweisungen ausführen, weil sie versuchen, die IS-Sperre zu erhalten. Die IS-Sperre und die X-Sperre schließen sich jedoch gegenseitig aus. Dadurch werden Dirty Reads, nicht wiederholbare Reads und Phantom Reads vermieden, und alle Transaktionen können nur seriell ausgeführt werden. wählen ... ; Dies ist die konsistenteste, aber am wenigsten gleichzeitige Isolationsebene. In Szenarien mit hoher Parallelität werden die beiden oben genannten Isolationsstufen a und d selten verwendet. 4. Fazit Gegenseitige Interferenzen zwischen gleichzeitigen Transaktionen können Probleme wie Dirty Reads, nicht wiederholbare Reads und Phantom Reads verursachen. InnoDB implementiert vier Isolationsebenen im SQL92-Standard:
Die Standardisolationsstufe von InnoDB ist RR und die am häufigsten verwendete Isolationsstufe ist RC Zusammenfassen Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Das könnte Sie auch interessieren:
|
<<: So richten Sie das Terminal so ein, dass Anwendungen nach dem Start von Ubuntu ausgeführt werden
>>: So gehen Sie mit Zeitzonenproblemen in Docker um
Holen Sie sich das Mongo-Image sudo docker pull m...
Heute habe ich eine Frage zur Konfiguration einer...
In diesem Artikel wird hauptsächlich die Layoutme...
Ein allgemeiner Vorschlag besteht darin, Indizes ...
Docker installiert MySQL Version 8.0.20 zu Ihrer ...
Als Vue-Benutzer ist es an der Zeit, React zu erw...
Definition Calcite kann SQL vereinheitlichen, ind...
Nginx kann seine Reverse-Proxy-Funktion zum Imple...
1. Drücken Sie Win + R und geben Sie cmd ein, um ...
Inhaltsverzeichnis 1. Komponentenorganisation 2. ...
Das Löschen einer Tabelle kommt nicht sehr häufig...
Während des Projekts habe ich begonnen, die js re...
Inhaltsverzeichnis 1. Datenquelle 2. Gesamtrangfo...
von Nehmen wir als Beispiel den im Bild gezeigten...
Ich bin vor zwei Tagen beim Bearbeiten der schrift...