Es gibt vier Transaktionsisolationsstufen: 1. Read Uncommitted (Lesen ohne Commit), was das Lesen von nicht festgeschriebenen Datenänderungen ermöglicht, die zu Dirty Reads, nicht wiederholbaren Reads und Phantom Reads führen können. 2. Read Committed (Read Committed) ermöglicht das Lesen von Daten, die von gleichzeitigen Transaktionen übermittelt wurden. Dadurch können schmutzige Lesevorgänge vermieden werden, es kann jedoch zu nicht wiederholbaren Lesevorgängen und Phantom-Lesevorgängen kommen. 3. Wiederholbarer Lesevorgang (wiederholbarer Lesevorgang). Die Ergebnisse mehrerer Lesevorgänge desselben Felds sind konsistent. 4. Serialisierbar (serialisierbar).
Die Betriebsumgebung dieses Tutorials: Windows7-System, MySQL8-Version, Dell G3-Computer.
1. Was ist eine Transaktion?
Eine Transaktion ist eine logische Reihe von Vorgängen. Entweder werden alle ausgeführt oder keine davon.
Das klassischste und am häufigsten genannte Beispiel für Transaktionen ist die Banküberweisung. Wenn Xiao Ming beispielsweise 1.000 Yuan an Xiao Hong überweisen möchte, umfasst diese Übertragung zwei wichtige Vorgänge: Reduzierung des Guthabens von Xiao Ming um 1.000 Yuan und Reduzierung des Guthabens von Xiao Hong um 1.000 Yuan. Wenn zwischen diesen beiden Vorgängen plötzlich ein Fehler auftritt, der dazu führt, dass sich der Kontostand von Xiao Ming verringert, der Kontostand von Xiao Hong jedoch nicht steigt, ist diese Situation definitiv nicht zulässig. Die Transaktion soll sicherstellen, dass diese beiden Schlüsseloperationen entweder erfolgreich sind oder keine von beiden erfolgreich ist.
2. Transaktionsmerkmale (ACID)
- **Atomizität: **Die kleinste Ausführungseinheit einer Transaktion, eine Aufteilung ist nicht zulässig. Die Atomizität von Transaktionen stellt sicher, dass entweder alle Aktionen ausgeführt werden oder keine.
- **Konsistenz:**Die Daten bleiben vor und nach der Ausführung der Transaktion konsistent. Beispielsweise sollte bei einem Geldtransfergeschäft der Gesamtbetrag des Überweisenden und des Zahlungsempfängers unverändert bleiben, unabhängig davon, ob die Transaktion erfolgreich ist oder nicht.
- ** Isolation: ** Beim gleichzeitigen Zugriff auf die Datenbank sollte die Transaktion eines Benutzers nicht von anderen Transaktionen beeinflusst werden und die Datenbank ist unabhängig von gleichzeitigen Transaktionen.
- **Persistenz:**Nachdem eine Transaktion festgeschrieben wurde, sind ihre Änderungen an den Daten in der Datenbank dauerhaft und sollten auch bei einem Datenbankausfall nicht beeinträchtigt werden.
3. Probleme, die durch gleichzeitige Transaktionen verursacht werden
In einer typischen Anwendung werden mehrere Transaktionen gleichzeitig ausgeführt und verwenden häufig dieselben Daten, um ihre jeweiligen Aufgaben auszuführen (mehrere Benutzer arbeiten mit denselben Daten). Obwohl Parallelität erforderlich ist, kann sie zu folgenden Problemen führen:
- **Dirty Read: **Wenn eine Transaktion auf Daten zugreift und diese ändert, die Transaktion jedoch noch nicht übermittelt wurde, dann hat eine andere Transaktion ebenfalls auf diese Daten zugegriffen und diese dann verwendet Da die Änderung dieser Daten nicht an die Datenbank übermittelt wurde, handelt es sich bei den von einer anderen Transaktion gelesenen Daten um „schmutzige Daten“ , Operationen basierend auf „schmutzigen Daten“. " kann Probleme verursachen. Änderungsverlust:
bedeutet, dass, wenn eine Transaktion Daten liest, auch andere Daten auf die Daten zugreifen. Nachdem die erste Transaktion die Daten geändert hat, ändert die zweite Transaktion auch diese Daten. Auf diese Weise gehen die Änderungsergebnisse der ersten Transaktion verloren. Diese Situation wird als „Änderungsverlust“ bezeichnet. Beispiel: Transaktion 1 liest die Daten in der Tabelle, aber der Änderungsdatensatz von Transaktion 1 geht verloren. -
Unwiederholbares Lesen: bezieht sich auf das mehrfache Lesen derselben Daten innerhalb einer Transaktion. Bevor die Transaktion endet, greift auch eine andere Transaktion auf die Daten zu und ändert die Daten. Dann ist es möglich, dass die von der ersten Transaktion zweimal gelesenen Daten inkonsistent sind. Diese Situation wird als nicht wiederholbares Lesen bezeichnet.
A=20
,事务2也读取A=20
,事务1修改A=A-1
,事务2也修改A=A-1
,最终结果都是19
- Phantom-Lesen: Phantom-Lesen ähnelt dem nicht wiederholbaren Lesen. Die Transaktion ist noch nicht beendet, und dann fügt eine andere Transaktion einige Daten ein Einige Daten. In der Abfrage werden bei der ersten Transaktion mehr Daten gelesen als ursprünglich gelesen, als ob eine Halluzination aufgetreten wäre. Dies wird daher als „Phantomlesen“ bezeichnet.
- Der Unterschied zwischen nicht wiederholbarem Lesen und Phantomlesen: Der Schwerpunkt des nicht wiederholbaren Lesens liegt auf der Änderung, während der Schwerpunkt beim Phantomlesen auf dem Hinzufügen oder Löschen liegt. Kastanie 1 (Gleiche Bedingungen, die Daten, die Sie lesen, werden anders sein, wenn Sie sie erneut lesen): Herr A in Transaktion 1 hat gelesen, dass sein Gehalt 1.000 beträgt. Die Operation ist noch nicht beendet, Herr B in Transaktion 2 I Das Gehalt von Herrn A wurde auf 2000 geändert. Wenn Herr A sein Gehalt erneut liest, lautet es 2000. Dies ist eine nicht wiederholbare Ablesung.
Kastanie 2 (gleiche Bedingungen, die Anzahl der beim ersten und zweiten Mal ausgelesenen Datensätze ist unterschiedlich): Wenn sich in einer Gehaltstabelle 4 Personen mit einem Gehalt über 3.000 befinden, liest Transaktion 1 alle Datensätze mit einem höheren Gehalt Als 3.000 wurden insgesamt 4 Datensätze abgefragt. Transaktion 1 hat einen weiteren Datensatz mit einem Gehalt von mehr als 3.000 abgefragt. Die Anzahl der abgefragten Datensätze betrug 5. Dies ist ein Phantom-Lesevorgang.
4. Transaktionsisolationsstufen
Der SQL-Standard definiert vier Isolationsstufen:
- **READ-UNCOMMITTED:**Die niedrigste Isolationsstufe, die Lesevorgänge zulässt, die noch nicht festgeschrieben wurden. Datenänderungen können dazu führen Dirty Reads, nicht wiederholbare Reads und Phantom Reads.
** READ-COMMITTED: ** Ermöglicht das Lesen von Daten, die durch gleichzeitige Transaktionen übermittelt wurden. - kann schmutzige Lesevorgänge vermeiden, kann jedoch zu nicht wiederholbaren und Phantom-Lesevorgängen führen.
**Wiederholbares Lesen (REPEATABLE-READ): **Die Ergebnisse mehrerer Lesevorgänge desselben Felds sind konsistent, es sei denn, die Transaktion selbst wird geändert. - Dirty Reads und nicht wiederholbare Lesevorgänge können vermieden werden, es kann jedoch zu Phantom-Lesevorgängen kommen . .
** SERIALISIERBAR: ** Die höchste Isolationsstufe, vollständig kompatibel mit der ACID-Isolationsstufe, alle Transaktionen werden nacheinander ausgeführt, - kann Dirty Reads, nicht wiederholbare Lesevorgänge und Phantom Reads vermeiden.
Isolationsstufe | Dirty Read | Nicht wiederholbares Lesen | Phantom Read |
Ungebundenes Lesen | √ | √ | √ |
Eingereicht lesen 🎈 |
|
MySQL InnoDB
Die Standard-Transaktionsisolationsstufe der Speicher-Engine ist Repeatable-READ (REPEATABLE-READ), die über den Befehl select @@tx_isolation übergeben werden kann ;
-Anweisung Zur Überprüfung, MySQL 8.0
Diese Anweisung wird in SELECT @@transaction_isolation;
MySQL InnoDB
存储引擎默认的事务隔离级别是可重复读(REPEATABLE-READ),可以通过命令select @@tx_isolation;
语句来查看,MySQL 8.0
该语句改为SELECT @@transaction_isolation;
mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
MySQL InnoDB
存储引擎的可重复读并不能避免幻读,需要应用使用加锁读来保证,这加锁读使用到的机制就是Next-Key Locks
。
因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是读取已提交(READ-COMMITTED),InnoDB
存储引擎默认使用 REPEATABLE-READ(可重读) 并不会有任何性能损失。
InnoDB
存储引擎在分布式事务的情况下一般会用到可串行化隔离级别。
? 拓展一下(以下内容摘自《MySQL 技术内幕:InnoDB 存储引擎(第 2 版)》7.7 章):
InnoDB存储引擎提供了对XA事务的支持,并通过XA事务来支持分布式事务的实现。分布式事务指的是允许多个独立的事务资源参与到一个全局的事务中。事务资源通常是关系型数据库系统,但也可以是其他类型的资源。全局事务要求在其中的所有参与的事务要么都提交,要么都回滚,这对事务的原有ACID要求又有了提高。另外,在使用分布式事务时,InnoDB 存储引擎的事务隔离级别必须设置为 SERIALIZABLE。
四、实际情况演示
MySQL
命令行的默认配置中事务都是自动提交的,即执行SQL
语句就会马上执行COMMIT
操作。可以用命令START TRANSACTION
开始一个事务。
我们可以通过下面命令设置事务隔离级别。
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]
我们再来看一下我们在实际操作中使用到的一些并发控制语句:
-
START TRANSACTION | BEGIN
:显示的开启一个事务。
-
COMMIT
:提交事务,使得对数据库做的所有修改成为永久性。
-
ROLLBACK
:回滚到结束用户的事务,并撤销正在进行的所有未提交的修改。
(脏读)读取未提交
(避免脏读)读取已提交
不可重复读
还是刚才上面的读已提交的图,虽然避免了读未提交,但是却出现了,一个事务还没有结束,就发生了 不可重复读问题。
可重复读
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ysjbfC4b-1651149978452)(https://qtspace.cn/contentimg/81.jpg)]
幻读
演示幻读出现的情况
sql 脚本 1 在第一次查询工资为 500 的记录时只有一条,sql 脚本 2 插入了一条工资为 500 的记录,提交之后;sql 脚本 1 在同一个事务中再次使用当前读查询发现出现了两条工资为 500 的记录这种就是幻读。
幻读和不可重复读有些相似之处 ,但是不可重复读的重点是修改,幻读的重点在于新增或者删除。
解决幻读的方法
- 将事务隔离级别调整为
SERIALIZABLE
。
- 在可重复读的事务级别下,给事务操作的这张表添加表锁。
- 在可重复读的事务级别下,给事务操作的这张表添加
Next-Key Locks
。
说明:Next-Key Locks
rrreee
MySQL InnoDB
geändert Die wiederholbaren Lese- und Zusammenführungs-Phantom-Lesevorgänge der Speicher-Engine können nicht vermieden werden, und die Anwendung muss gesperrte Lesevorgänge verwenden, um sicherzustellen, dass der für gesperrte Lesevorgänge verwendete Mechanismus Next-Key Locks
ist.
Denn je niedriger die Isolationsstufe, desto weniger Sperren werden von der Transaktion angefordert. Daher ist die Isolationsstufe der meisten Datenbanksysteme READ-COMMITTED, InnoDB
. Die Speicher-Engine verwendet REPEATABLE-READ (wiederlesbar) standardmäßig ohne Leistungseinbußen. InnoDB
Die Speicher-Engine verwendet bei verteilten Transaktionen im Allgemeinen die Isolationsstufe Serialisierbar.
🎜? Erweitern (der folgende Inhalt ist ein Auszug aus Kapitel 7.7 von „MySQL Technology Insider: InnoDB Storage Engine (2. Auflage)“): 🎜🎜InnoDB Storage Engine bietet Unterstützung für XA-Transaktionen und unterstützt die Implementierung von XA-Transaktionen bei der Verteilung formelle Transaktionen. Unter verteilten Transaktionen versteht man die Teilnahme mehrerer unabhängiger Transaktionsressourcen an einer globalen Transaktion. Bei Transaktionsressourcen handelt es sich in der Regel um relationale Datenbanksysteme, es kann sich jedoch auch um andere Arten von Ressourcen handeln. Globale Transaktionen erfordern, dass alle teilnehmenden Transaktionen entweder festgeschrieben oder zurückgesetzt werden, was die ursprünglichen ACID-Anforderungen für Transaktionen weiter verbessert. Darüber hinaus muss bei Verwendung verteilter Transaktionen die Transaktionsisolationsstufe der InnoDB-Speicher-Engine auf SERIALIZABLE eingestellt sein. 🎜🎜🎜MySQL
In der Standardkonfiguration der Befehlszeile sind Transaktionen automatisch übermittelt, d. h. durch die Ausführung der SQL
-Anweisung wird sofort die COMMIT
-Operation ausgeführt. Mit dem Befehl START TRANSACTION
können Sie eine Transaktion starten. 🎜🎜Wir können die Transaktionsisolationsstufe mit dem folgenden Befehl festlegen. 🎜rrreee🎜Werfen wir einen Blick auf einige der Parallelitätskontrollanweisungen, die wir in tatsächlichen Vorgängen verwenden: 🎜
-
START TRANSACTION | BEGIN
: Öffnen Sie eine Transaktion explizit.
-
COMMIT
: Bestätigen Sie die Transaktion und machen Sie alle Änderungen an der Datenbank dauerhaft.
-
ROLLBACK
: Führen Sie einen Rollback zum Ende der Benutzertransaktion durch und machen Sie alle laufenden, nicht festgeschriebenen Änderungen rückgängig.
🎜🎜🎜🎜🎜Nicht wiederholbares Lesen🎜Es ist immer noch das obige Bild, das nicht festgeschrieben wurde, aber eine Transaktion wird angezeigt, bevor sie endet. Es ist ein wiederholbares Leseproblem aufgetreten. 🎜🎜🎜🎜[Die Bildübertragung über den externen Link ist fehlgeschlagen. Es wird empfohlen, das Bild zu speichern und direkt hochzuladen (img-ysjbfC4b -1651149978452) (https: //qtspace.cn/contentimg/81.jpg)]🎜🎜Demonstrieren Sie das Auftreten von Phantomlesung🎜🎜🎜🎜SQL-Skript 1 fragt den Datensatz mit ab Zum ersten Mal gab es nur einen Datensatz. SQL-Skript 2 fügte einen Datensatz mit einem Gehalt von 500 ein. Nach der Übermittlung verwendete SQL-Skript 1 die aktuelle Leseabfrage erneut in derselben Transaktion und stellte fest, dass zwei Datensätze vorhanden waren mit einem Gehalt von 500 erschien dies eine Phantomlesung. 🎜🎜Phantomlesen und nicht wiederholbares Lesen ähneln sich in gewisser Weise, aber der Schwerpunkt des nicht wiederholbaren Lesens liegt auf der Änderung, während der Schwerpunkt des Phantomlesens auf dem Hinzufügen oder Löschen liegt. 🎜🎜Methoden zur Lösung von Phantom-Lesevorgängen🎜
- Passen Sie die Transaktionsisolationsstufe auf
SERIALIZABLE
an.
- Fügen Sie auf der Ebene der wiederholbaren Lesetransaktion eine Tabellensperre zur Tabelle im Transaktionsvorgang hinzu.
- Fügen Sie auf der Ebene der wiederholbaren Lesetransaktionen
Next-Key Locks
zur Tabelle für Transaktionsvorgänge hinzu.
🎜Erklärung: Next-Key Locks
entspricht Zeilensperre + Lückensperre🎜🎜🎜[Verwandte Empfehlung: 🎜MySQL-Video-Tutorial🎜]🎜
Das obige ist der detaillierte Inhalt vonWas sind die Isolationsstufen für MySQL-Transaktionen?. 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