Heim >Datenbank >MySQL-Tutorial >Beispiel für die Isolationsstufe einer MySQL-Transaktion und Dirty Read, Phantom Read, nicht wiederholbarer Lesevorgang

Beispiel für die Isolationsstufe einer MySQL-Transaktion und Dirty Read, Phantom Read, nicht wiederholbarer Lesevorgang

coldplay.xixi
coldplay.xixinach vorne
2021-01-05 18:01:002540Durchsuche

Beispiel für die Isolationsstufe einer MySQL-Transaktion und Dirty Read, Phantom Read, nicht wiederholbarer Lesevorgang

Empfohlen (kostenlos): MySQL-Video-Tutorial

Isolierung von Transaktionen

MySQL ist eine Client-/Server-Architektursoftware. Für denselben Server können mehrere Clients eine Verbindung herstellen Nachdem sich jeder Client mit dem Server verbunden hat, kann er als Sitzung bezeichnet werden. Jeder Client kann in seiner eigenen Sitzung eine Anforderungsanweisung an den Server senden. Eine Anforderungsanweisung kann Teil einer Transaktion sein, d. h. der Server kann mehrere Transaktionen gleichzeitig verarbeiten. Wenn mehrere Transaktionen gleichzeitig in der Datenbank ausgeführt werden, können Probleme wie Dirty Read, nicht wiederholbares Lesen und Phantom Read auftreten. Um diese Probleme zu lösen, gibt es das Konzept der „Isolationsstufe“.

Theoretisch sollten andere Transaktionen in die Warteschlange gestellt werden, wenn eine Transaktion auf bestimmte Daten zugreift. Erst nachdem die Transaktion übermittelt wurde, können andere Transaktionen weiterhin auf die Daten zugreifen. Aber im Allgemeinen gilt: Je stärker die Isolierung, desto geringer die Effizienz. Daher müssen wir oft ein Gleichgewicht zwischen Isolation und Effizienz finden.

Probleme bei gleichzeitiger Transaktionsausführung

Dirty Read: Dirty Read bedeutet, dass eine Transaktion Daten liest, die durch eine andere nicht festgeschriebene Transaktion geändert wurden.

Wenn das Konto von Xiao Wang beispielsweise einen Saldo von 100 aufweist, sind zwei Transaktionen erforderlich, um auf das Konto von Xiao Wang zuzugreifen.

Nicht wiederholbares Lesen:
Sitzung A Sitzung B
begin;
xxx set balance = balance+50 where client_no = 'Xiao Wang client number' ; beginnen;

Wählen Sie den Kontostand aus xxx aus, wobei client_no = 'Xiao Wang-Kundennummer' ist.
(Wenn 150 angezeigt wird, bedeutet dies, dass ein Dirty Read aufgetreten ist) Oben haben Sitzung A und Sitzung B jeweils eine Transaktion eröffnet. Zu diesem Zeitpunkt hat Konto B überprüft, ob der Kontostand von Xiao Wang 150 beträgt Der Kontostand von Xiao Wang betrug 150. Die 150 werden zu falschen fehlerhaften Daten.
Nicht wiederholbares Lesen bezieht sich auf das mehrmalige Lesen desselben Datensatzes innerhalb derselben Transaktion, die Ergebnisse sind jedoch unterschiedlich. Nicht wiederholbare Lesevorgänge treten auf, weil die abgefragten Daten während mehrerer Suchvorgänge durch andere Transaktionen geändert wurden. Schauen Sie sich die beiden Sitzungsanfragen unten an.

Sitzung A

Sitzung B

Beginn;Wählen Sie den Kontostand aus xxx, wobei client_no = 'Xiao Wang Kundennummer' ; (lesen Sie den Kontostand. 10 0) begin;update xxx set balance = balance+50 where client_no = 'Xiao Wang' Customer number' ;Phantom-Lesen: Das sogenannte Phantom-Lesen bedeutet, dass, wenn eine Transaktion Datensätze in einem bestimmten Bereich liest, eine andere Transaktion einen neuen Datensatz in den Bereich einfügt, wenn die vorherige Transaktion erneut Datensätze in diesem Bereich liest liest Daten, die zuvor nicht gelesen wurden. Sitzung ASitzung Bbeginnen;

(Wenn 150 angezeigt wird, bedeutet dies, dass ein nicht wiederholbarer Lesevorgang erfolgt ist)
commit;

In derselben Transaktion von Sitzung A, dieselbe Abfrage zweimal. Die Ergebnisse sind unterschiedlich, was bedeutet, dass ein nicht wiederholbarer Lesevorgang aufgetreten ist.
Angenommen, dass derzeit nur der Kontostand von Xiao Wang in der Kontotabelle 100 beträgt, sehen Sie sich dann die folgenden beiden Sitzungsanfragen an.


Wählen Sie einen Namen aus xxx, wobei der Saldo = 100 ist;

(gelesener Name ist „小王“)

beginnen; Einfügen in xxx(Kundennummer,Name,Kontostand) Werte('Xiao Zhang Kundennummer','Xiao Zhang',100);Name aus xxx auswählen Dabei ist der Saldo = 100

Die zweite Abfrage in der Sitzung Eine Transaktion hat den Namen „Xiao Zhang“ gefunden, der in der ersten Abfrage nicht gefunden wurde, was bedeutet, dass ein Phantomlesevorgang aufgetreten ist.

Vier durch den SQL-Standard festgelegte Isolationsstufen

Die ISO- und ANIS-SQL-Standards haben vier Transaktionsisolationsstufen festgelegt, nämlich: nicht festgeschriebenes Lesen (nicht festgeschriebenes Lesen), festgeschriebenes Lesen (festgeschriebenes Lesen), wiederholbares Lesen (wiederholbares Lesen) und Serialisierung (serialisierbar).

Werfen wir zunächst einen Blick auf die Bedeutung dieser vier Isolationsstufen.

  • Unverbindlich lesen: Wenn eine Transaktion nicht übermittelt wurde, sind die vorgenommenen Änderungen für andere Transaktionen sichtbar.
  • Commit lesen: Nachdem eine Transaktion festgeschrieben wurde, werden die vorgenommenen Änderungen von anderen Transaktionen gesehen.
  • Wiederholbares Lesen: Die während der Ausführung einer Transaktion angezeigten Daten stimmen immer mit den Daten überein, die beim Start der Transaktion angezeigt werden. Natürlich sind unter der wiederholbaren Leseisolationsstufe nicht festgeschriebene Änderungen auch für andere Transaktionen unsichtbar.
  • Serialisierung: Wie der Name schon sagt, fügt „Schreiben“ für dieselbe Datensatzzeile eine „Schreibsperre“ und „Lesen“ eine „Lesesperre“ hinzu. Wenn ein Lese-/Schreibsperrenkonflikt auftritt, muss die Transaktion, auf die später zugegriffen wird, auf den Abschluss der vorherigen Transaktion warten, bevor sie weiter ausgeführt werden kann.

SQL-Standards legen fest, dass gleichzeitige Transaktionen bei verschiedenen Isolationsstufen Probleme unterschiedlicher Schwere verursachen können. Die spezifische Situation ist wie folgt:
(√ bedeutet, dass es passieren kann; × bedeutet, dass es nicht passieren kann)( √ 表示可以发生;× 表示不可以发生)

commit;
隔离级别 脏读 不可重复读 幻读
读未提交(read uncommitted)
读提交(read committed) ×
可重复读(repeatable read) × ×
串行化(serializable ) × × ×

MySQL对四种隔离级别的支持情况

虽然 ISO 和 ANIS SQL 标准制定了四种事务隔离级别的标准,但不是所有数据库厂商都遵循这些标准,比如 Oracle 数据库就不支持读未提交(read uncommitted)和可重复读(repeatable read)的事务隔离级别。

MySQL InnoDB 存储引擎支持4种隔离级别,但与 SQL 标准中定义的不同的是,InnoDB 存储引擎在默认的可重复读(repeatable read)事务隔离级别下,使用 Next-Key Lock 锁的算法,避免了幻读的产生。也就是说 InnoDB 存储引擎在可重复读(repeatable read)的事务隔离级别下,已经可以完全保证事务的隔离性要求,即达到了 SQL 标准中的串行化(serializable )隔离级别的要求。

如何设置事务的隔离级别

在 InnoDB 存储引擎中,可以使用以下命令来设置全局或者当前会话的事务隔离级别:

SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL{	READ UNCOMMITTED
	| READ COMMITTED
	| REPEATABLE READ
	| SERIALIZABLE}

如想设置当前会话的隔离级别为读提交,可以使用如下语句:

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

如果想在 MySQL 数据库启动时就设置事务的默认隔离级别,那就需要修改配置文件中 transaction-isolation 的值,比方说,我们在启动前指定了 transaction-isolation = READ COMMITTED Isolationsstufe Dirty Read Nicht wiederholbarer Lesevorgang Phantom Read th>

read uncommitted √ √ √ td> read commit × √ √ Repeatable lesen × × √ Serialisierbar × td> × ×

MySQL-Unterstützung für vier Isolationsstufen

Obwohl die ISO- und ANIS-SQL-Standards formuliert wurden Standards für vier Transaktionsisolationsstufen, nicht alle Datenbankanbieter befolgen diese Standards. Beispielsweise unterstützt die Oracle-Datenbank nicht die Transaktionsisolationsstufe „Read Uncommitted“ (Lesen nicht festgeschrieben) und „Repeatable Read“ (Wiederholbares Lesen).

Die MySQL InnoDB-Speicher-Engine unterstützt 4 Isolationsstufen, aber anders als im SQL-Standard definiert, verwendet die InnoDB-Speicher-Engine die Next-Key-Sperre unter der Standard-Transaktionsisolationsstufe für wiederholbares Lesen (wiederholbares Lesen). Der Algorithmus vermeidet das Auftreten des Phantomlesens. Mit anderen Worten, die InnoDB-Speicher-Engine kann die Isolationsanforderungen von Transaktionen unter der Transaktionsisolationsstufe des wiederholbaren Lesens vollständig garantieren, dh sie hat die Anforderungen der serialisierbaren Isolationsstufe im SQL-Standard erreicht.

So legen Sie die Isolationsstufe einer Transaktion fest

In der InnoDB-Speicher-Engine können Sie den folgenden Befehl verwenden, um die Transaktionsisolationsstufe der globalen oder aktuellen Sitzung festzulegen: 🎜
SELECT @@transaction_isolation;
🎜Wenn Sie die Isolation festlegen möchten Wenn Sie die Standardisolationsstufe für Transaktionen beim Start der MySQL-Datenbank festlegen möchten, müssen Sie den Wert von „transaction-isolation“ in der Konfiguration ändern Geben Sie beispielsweise vor dem Start transaction-isolation = READ COMMITTED an, dann ändert sich die Standardisolationsstufe der Transaktion von der ursprünglichen REPEATABLE READ in READ COMMITTED. 🎜🎜Um die Transaktionsisolationsstufe der aktuellen Sitzung anzuzeigen, können Sie die folgende Anweisung verwenden: 🎜
SELECT @@global.transaction_isolation;
🎜Um die globale Transaktionsisolationsstufe anzuzeigen, können Sie die folgende Anweisung verwenden: 🎜rrreee🎜🎜Hinweis: „transaction_isolation“ wurde in MySQL 5.7 eingeführt .20 zum Ersetzen von tx_isolation Ja, wenn Sie eine frühere Version von MySQL verwenden, ersetzen Sie bitte die oben verwendete Transaktionsisolation durch tx_isolation. 🎜🎜🎜Weitere Programmierkenntnisse finden Sie unter: 🎜Programmiervideo🎜! ! 🎜

Das obige ist der detaillierte Inhalt vonBeispiel für die Isolationsstufe einer MySQL-Transaktion und Dirty Read, Phantom Read, nicht wiederholbarer Lesevorgang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen