Heim  >  Artikel  >  Datenbank  >  Was ist die Transaktionsisolationsstufe von MySQL Innodb?

Was ist die Transaktionsisolationsstufe von MySQL Innodb?

青灯夜游
青灯夜游nach vorne
2019-02-26 11:19:011868Durchsuche

Der Inhalt dieses Artikels soll Ihnen vorstellen, was die Transaktionsisolationsstufe von MySQL Innodb ist. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird Ihnen hilfreich sein.

Mysql verfügt über vier Transaktionsisolationsstufen, wie folgt:

1. Nicht festgeschrieben lesen: Es ermöglicht das Lesen schmutziger Daten, die geändert, aber nicht von anderen Transaktionen festgeschrieben wurden, und Dies führt auch zu Problemen mit nicht wiederholbarem Lesen und Phantomlesen.

2. Read Committed: Das Lesen schmutziger Daten kann vermieden werden, es treten jedoch weiterhin Probleme mit nicht wiederholbaren Lesevorgängen und Phantom-Lesevorgängen auf .

3. REPEATABLE-READ: Die Standardisolationsstufe von MySQL führt zu Phantom-Lesevorgängen. Allerdings verwendet MySQL auf dieser Ebene MVCC-Konsistenzlesungen und generiert keine Phantom-Lesevorgänge. .

4. Serialisierbar: Die höchste Isolationsstufe, die die oben genannten Probleme vermeidet

Sie können die folgende Methode verwenden, um die Isolationsstufe des aktuellen Systems zu überprüfen

mysql> select @@global.tx_isolation,@@tx_isolation;
+-----------------------+-----------------+
| @@global.tx_isolation | @@tx_isolation  |
+-----------------------+-----------------+
| REPEATABLE-READ       | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)

Nicht festgeschriebenes LesenREAD-UNCOMMITTED Beispiel für Dirty Read und nicht wiederholbares Lesen:

#session A
mysql> set session transaction isolation level read uncommitted;   #设置隔离级别为未提交读
Query OK, 0 rows affected (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from inno_tbl where id=2;
+----+------+
| id | name |
+----+------+
|  2 | John |
+----+------+
1 row in set (0.00 sec)
#session B
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update inno_tbl set name='Jack Ma' where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
#session A
mysql> select * from inno_tbl where id=2;
+----+---------+
| id | name    |
+----+---------+
|  2 | Jack Ma |
+----+---------+
1 row in set (0.00 sec)

Zu diesem Zeitpunkt liest Sitzung A die von der Sitzung geänderten, aber nicht übermittelten Daten B. Wenn Sitzung B zu diesem Zeitpunkt zurückgesetzt wird, sind die von A gelesenen Daten ungültig, was „schmutzige Daten“ darstellt, da sich die von A zum ersten Mal gelesenen Daten von den zum zweiten Mal gelesenen Daten unterscheiden ein „nicht wiederholbarer Lesevorgang“; Wenn in B neue Daten eingefügt werden, werden in dieser Transaktion auch neue Datenzeilen in A gelesen. Dies ist ein Phantom-Lesevorgang.

Wenn Sie im gleichen Prozess die Isolationsstufe von A auf „Read Committed“ ändern, kommt es nicht zu „Dirty Reads“, aber auch zu „non-repeatable Reads“ und „Phantom Reads“

Standardisolationsstufe REPEATABLE-READ:

#session A
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from inno_tbl where id=2;
+----+--------------+
| id | name         |
+----+--------------+
|  2 | John         |
+----+--------------+
1 row in set (0.00 sec)
#session B
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> update inno_tbl set name='Lucy' where id=2; 
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.03 sec)
#session A
mysql> select * from inno_tbl where id=2;
+----+--------------+
| id | name         |
+----+--------------+
|  2 | John         |
+----+--------------+
1 row in set (0.00 sec)
#注意,此时没有产生“不可重复读”问题,但若是为查询加上共享锁:
mysql> select * from inno_tbl1 where id=2 lock in share mode;
+----+---------+
| id | name    |
+----+---------+
|  2 | Lucy    |
+----+---------+
1 row in set (0.00 sec)

Beschreibung:

Die Transaktion in Sitzung A liest, dass das Namensfeld in der inno_tbl-Tabelle mit der ID 2 John ist, und wenn die Transaktion in Sitzung B den Namen mit der ID 2 in inno_tbl in „Lucy“ ändert und ihn übermittelt, wenn die Transaktion in A diese Datenzeile später liest, wird festgestellt, dass die gelesene Zeile direkt mit der Select-Methode abgefragt wird Bei den Daten handelt es sich immer noch um die alten Daten, und mit der gemeinsamen Sperre werden die echten Daten gelesen.

Warum? Denn in der Innodb-Engine können die Anweisungen zum Hinzufügen, Löschen, Ändern und Abfragen von MySQL in zwei Typen unterteilt werden: einer ist Snapshot-Lesen und der andere ist aktueller Lesevorgang. Nur ​​gewöhnliche Abfrageanweisungen sind Snapshot-Lesevorgänge, während die übrigen Hinzufügungen, Löschungen, Änderungen und Abfrageanweisungen mit einer Sperre im Shared-Modus oder einer For-Update-Exklusivsperre alle aktuellen Lesevorgänge sind Die neuesten Daten werden gelesen, während beim Snapshot-Lesen nicht unbedingt die neuesten Daten gelesen werden.

Daraus lässt sich ableiten: Beim Aktualisieren oder Löschen mit der Bedingung name=John in Sitzung A wird das Aktualisieren oder Löschen definitiv nicht erfolgreich sein, wie unten gezeigt:

mysql> update inno_tbl set name='张三' where name='John';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0
mysql> delete from inno_tbl where name='John';
Query OK, 0 rows affected (0.00 sec)

Wenn Sie isolieren Wenn die Ebene auf Read Commited geändert wird, kann die Abfrageanweisung in Sitzung A den neuesten Inhalt abfragen, der in Sitzung B geändert und übermittelt wurde, ohne eine Sperre im Freigabemodus oder zur Aktualisierung hinzuzufügen namens Unmöglichkeit wiederholt lesen. Während ich dies schreibe, habe ich eine kleine Frage. Widersprechen sich Nicht wiederholbares Lesen und Phantomlesen? Antwort: Nein, nicht wiederholbares Lesen dient hauptsächlich der Modifikation und dem Phantomlesen Das Lesen dient hauptsächlich der Änderung.

Das obige ist der detaillierte Inhalt vonWas ist die Transaktionsisolationsstufe von MySQL Innodb?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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