Heim  >  Artikel  >  Datenbank  >  Lassen Sie uns ausführlich über Transaktionsfunktionen und Implementierungsprinzipien in MySQL sprechen

Lassen Sie uns ausführlich über Transaktionsfunktionen und Implementierungsprinzipien in MySQL sprechen

青灯夜游
青灯夜游nach vorne
2023-02-10 19:55:171418Durchsuche

Dieser Artikel wird über die Transaktionsfunktionen in MySQL sprechen und das Implementierungsprinzip der Parallelitätskontrolle mehrerer Versionen von MVCC vorstellen. Ich hoffe, dass er für alle hilfreich ist!

Lassen Sie uns ausführlich über Transaktionsfunktionen und Implementierungsprinzipien in MySQL sprechen

1. Konzept

Transaktion bezieht sich im Allgemeinen auf einen logischen Satz von Operationen oder eine Reihe von Operationen, die als eine einzige logische Einheit ausgeführt werden. Alle Operationen in einer Transaktion werden in einer untrennbaren Einheit gekapselt Bei geteilter Ausführungseinheit sind alle Vorgänge in dieser Einheit entweder erfolgreich oder schlagen fehl. Solange einer der Vorgänge fehlschlägt, wird die gesamte Transaktion zurückgesetzt. 2. Einführung in Transaktionsmerkmale und -typen Sie werden erfolgreich ausgeführt oder alle Ausführungen schlagen fehl.

Konsistenz

Die Konsistenz einer Transaktion bedeutet, dass die Daten vor und nach der Ausführung der Transaktion immer in einem konsistenten Zustand sind.

Isolation

Lassen Sie uns ausführlich über Transaktionsfunktionen und Implementierungsprinzipien in MySQL sprechenIsolation von Transaktionen bedeutet, dass sich zwei gleichzeitig ausgeführte Transaktionen nicht gegenseitig stören. Das heißt, während der Ausführung einer Transaktion können Sie den laufenden Prozess anderer Transaktionen nicht sehen.

?‍Hinweis:

Mechanismus zur Gewährleistung der Transaktionsisolation.

Persistenz (Dauer)

Die Haltbarkeit einer Transaktion bedeutet, dass nach dem Festschreiben der Transaktion die durch diese Transaktion vorgenommenen Änderungen an den Daten in der Datenbank gespeichert bleiben und nicht zurückgesetzt werden.

2.2 Einführung in zwei Arten von Transaktionen.

Lokale Transaktionen.

Verteilte Transaktionen. MySQL是通过锁个MVCC

Ausführungsprozess lokaler Transaktionen

Bevor der Client den Transaktionsvorgang startet, muss er eine Verbindungsantwort öffnen;

  • Nachdem die Antwort gestartet wurde, initiiert der Client eine Anweisung zum Starten Transaktion;
Nach dem Start der Transaktion sendet der Client verschiedene SQL-Anweisungen, um die Daten zu verarbeiten.

Unter normalen Umständen initiiert der Client eine Anweisung zum Festschreiben der Transaktion ein Rollback-Transaktionsbefehl;

Das Obige: Sobald der Vorgang abgeschlossen ist, schließen Sie die Sitzung.

✔Lokale Angelegenheiten werden vor Ort vom Ressourcenmanager verwaltet. Lassen Sie uns ausführlich über Transaktionsfunktionen und Implementierungsprinzipien in MySQL sprechen

  • Die Nachteile lokaler Transaktionen sind:

  • ist nicht in der Lage, verteilte Transaktionen zu verarbeiten.

    Ein Transaktionsprozess kann nur eine Verbindung zu einer Datenbank herstellen, die Transaktionen unterstützt, und kann nicht für mehrere Transaktionsdatenbanken verwendet werden.
  • 3. Welche Probleme werden gleichzeitige Transaktionen mit sich bringen? Der ausgewählte Wert aktualisiert die Datenzeile. Es wird davon ausgegangen, dass die Transaktionen die gegenseitige Existenz nicht erkennen können, sodass der letzte Aktualisierungsvorgang die von anderen Transaktionen zuvor abgeschlossenen Aktualisierungsvorgänge überschreibt.
  • Zum Beispiel:

  • Zhang Sans Konto beträgt 100 Yuan. Derzeit gibt es zwei Transaktionen: Transaktion 1 und Transaktion 2. Transaktion 1 dient dazu, den Kontostand von Zhang San um 100 Yuan zu erhöhen, und Transaktion 2 dient dazu, den Kontostand von Zhang San zu erhöhen um 100 Yuan addieren. Zunächst wurde bei Transaktion 1 und Transaktion 2 gleichzeitig der Kontostand von Zhang San angezeigt. Gehen Sie dann davon aus, dass Transaktion 1 vor Transaktion 2 eingereicht wurde Der Kontostand von Zhang San beträgt 300 Yuan (normalerweise sollten es 400 Yuan sein), was bedeutet, dass die später eingereichte Transaktion 2 den Aktualisierungsvorgang von Transaktion 1 überschreibt. Dies ist der sogenannte Aktualisierungsverlust (Dirty Write) ist im Wesentlichen ein Konflikt zwischen Schreibvorgängen. Die Möglichkeit, Dirty Writes zu lösen, besteht jedoch darin, jede Transaktion seriell auszuführen, um sicherzustellen, dass Transaktionen Schreibvorgänge in einer bestimmten Reihenfolge ausführen.

Dirty Read

Eine Transaktion liest nicht festgeschriebene Daten aus einer anderen Transaktion. Beispiel: Transaktion 1 erhöht den Kontostand von Zhang San um 100 Yuan. Eine andere Transaktion liest die geänderten Daten. Wenn keine Transaktion vorliegt, werden sie von der zweiten Transaktion gelesen Nicht übermittelte Daten werden erkannt und der nächste Schritt der Verarbeitung des Dirty-Data-Clusters erzeugt eine Abhängigkeit von den nicht festgeschriebenen Daten. Dieses Phänomen wird normalerweise als Dirty Read脏读,也就是说:脏读是一个事务读取了另一个事务没提交的数据。

Lassen Sie uns ausführlich über Transaktionsfunktionen und Implementierungsprinzipien in MySQL sprechen

?脏读本质上是读写操作的冲突,解决方法是先写后读,也就是写完之后再读。

不可重复读

一个事务读取了某些数据,在一段时间后,这个事务再次读取之前读过的数据,此时发现读取的数据发生了变化,或者其中某些数据记录已经被删除,这种现象被称为:不可重复读,即同一个事务,使用同样的查询语句,在不同时刻读取到的结果不一致。

不可重复读的本质上也是读写操作冲突,解决方法是先读后写,也就是读完之后再写。

幻读

一个事务按照相同的查询条件重新读取之前读过的数据,此时发现其他事务插入了满足当前查询条件的新数据,数据结果集变多,这种现象称为幻读,即一个事务两次读取一个范围的数据记录,两次读到的结果不同。

幻读的本质上也是读写操作冲突,解决方法是先读后写,也就是读完之后再写。

那到这里,很多小伙伴就有疑问,同样本质都是读写操作冲突,解决方法是先读后写,不可重复读和幻读到底有何区别?,我下面见简单解释一下:

  • 1️⃣ 不可重复读的重点在于更新和删除操作,而幻读的重点在于插入操作。

  • 2️⃣ MySQL使用锁机制实现事务的隔离级别时,在可重复读隔离级别中,SQL语句第一个读取到数据后,会将相应的数据加锁,使得其他事务无法修改和删除这些数据,通过锁的方式实现可重复读。但是这种方法无法对新数据的插入加锁,如果事务1读取了数据,或者修改和删除了数据,事务2还可以进行插入操作,导致事务1莫名其妙地多了一条之前没有的数据,这就是幻读。

  • 3️⃣ 所以,幻读是无法通过锁机制来避免,需要使用串行化的事务隔离级别,但是这种事务隔离级别会大大降低数据库的并发能力。

✔MySQL是通过MVCC(多版本并发控制)机制来避免不可重复读和幻读的。

四、MySQL事务的隔离级别

Lassen Sie uns ausführlich über Transaktionsfunktionen und Implementierungsprinzipien in MySQL sprechen

使用下面的命令可以查询全局级别和会话级别的事务隔离级别:

# 默认数据库的事务隔离级别为:可重复读(REPEATABLE-READ)
SELECT @@global.tx_isolation;
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;

Lassen Sie uns ausführlich über Transaktionsfunktionen und Implementierungsprinzipien in MySQL sprechen

五、多版本并发控制MVCC

Multi-Version Concurrency Control多版本并发控制,MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。

MVCC比锁的优势

可以将MVCC bezeichnet. Das heißt:

Dirty Beim Lesen liest eine Transaktion Daten, die nicht von einer anderen Transaktion übermittelt wurden. 🎜🎜🎜Lassen Sie uns ausführlich über Transaktionsfunktionen und Implementierungsprinzipien in MySQL sprechen🎜🎜?Dirty Reading ist im Wesentlichen ein Konflikt zwischen Lese- und Schreibvorgängen. Die Lösung besteht darin, zuerst zu schreiben und dann zu lesen, also nach dem Schreiben zu lesen. 🎜

🎜Nicht wiederholbares Lesen🎜🎜🎜Eine Transaktion liest bestimmte Daten nach einer gewissen Zeit erneut Wenn festgestellt wird, dass sich die gelesenen Daten geändert haben oder einige der Datensätze gelöscht wurden, wird dieses Phänomen als nicht wiederholbares Lesen bezeichnet. 🎜Das heißt, dieselbe Transaktion verwendet dieselbe Abfrageanweisung und liest zu unterschiedlichen Zeiten. Die Ergebnisse sind inkonsistent . 🎜🎜
🎜Nicht wiederholbares Lesen ist im Wesentlichen ein Konflikt zwischen Lese- und Schreibvorgängen. Die Lösung besteht darin, zuerst zu lesen und dann zu schreiben, dh nach dem Lesen zu schreiben. 🎜

🎜Phantomlesung🎜🎜🎜Eine Transaktion liest die zuvor gelesenen Daten gemäß den gleichen Abfragebedingungen erneut Eingefügte Daten, die die aktuellen Abfragebedingungen erfüllen, werden größer. Dieses Phänomen wird als Phantomlesen bezeichnet, d. h. eine Transaktion liest einen Bereich von Datensätzen zweimal und die Ergebnisse, die zweimal gelesen werden, sind unterschiedlich. 🎜
🎜Phantomlesen ist im Wesentlichen ein Konflikt zwischen Lese- und Schreibvorgängen. Die Lösung besteht darin, zuerst zu lesen und dann zu schreiben, dh nach dem Lesen zu schreiben. 🎜
🎜An diesem Punkt haben viele Freunde den gleichen Konflikt zwischen Lese- und Schreibvorgängen. Die Lösung besteht darin, zuerst zu lesen und dann zu schreiben. Ich werde es im Folgenden kurz erklären: 🎜
  • 🎜1️⃣ Der Schwerpunkt des nicht wiederholbaren Lesens liegt auf Aktualisierungs- und Löschvorgängen, während der Schwerpunkt des Phantom-Lesens auf dem Einfügen liegt Betrieb. 🎜
  • 🎜2️⃣ Wenn MySQL den Sperrmechanismus verwendet, um Transaktionsisolationsstufen zu implementieren, werden in der wiederholbaren Leseisolationsstufe die entsprechenden Daten gesperrt, nachdem die erste SQL-Anweisung die Daten gelesen hat, sodass andere Transaktionen dies nicht können Ändern oder löschen Sie diese Daten, und ein wiederholbares Lesen wird durch Sperren erreicht. Diese Methode kann jedoch das Einfügen neuer Daten nicht sperren. Wenn Transaktion 1 die Daten liest oder ändert oder löscht, kann Transaktion 2 auch einen Einfügungsvorgang ausführen, was dazu führt, dass Transaktion 1 aus unerklärlichen Gründen ein zusätzliches Datenelement hinzufügt, das nicht verfügbar war vorher. Das ist Phantomlesung. 🎜
  • 🎜3️⃣ Daher können Phantomlesevorgänge nicht durch den Sperrmechanismus vermieden werden. Es muss eine serialisierte Transaktionsisolationsstufe verwendet werden, diese Transaktionsisolationsstufe verringert jedoch die Parallelitätsfähigkeit der Datenbank erheblich. 🎜
🎜 ✔MySQL verwendet den MVCC-Mechanismus (Multiple Version Concurrency Control), um nicht wiederholbare Lesevorgänge und Phantom-Lesevorgänge zu vermeiden. 🎜

🎜4. Isolationsstufe von MySQL-Transaktionen🎜

🎜Lassen Sie uns ausführlich über Transaktionsfunktionen und Implementierungsprinzipien in MySQL sprechen🎜🎜Verwenden Sie den folgenden Befehl, um die Transaktionsisolationsstufen auf globaler und Sitzungsebene abzufragen: 🎜
-- 事务A操作
START TRANSACTION;
SELECT * FROM account WHERE id = 1;     //在事务B提交之前执行
SELECT * FROM account WHERE id = 1;     //在事务B提交之后执行
COMMIT;
🎜Lassen Sie uns ausführlich über Transaktionsfunktionen und Implementierungsprinzipien in MySQL sprechen🎜

🎜5. Parallelitätskontrolle für mehrere Versionen MVCC🎜

🎜Parallelitätskontrolle für mehrere VersionenParallelitätskontrolle für mehrere Versionen, MVCC ist ein Parallelitätskontrollmethoden werden im Allgemeinen in Datenbankverwaltungssystemen verwendet, um gleichzeitigen Zugriff auf die Datenbank zu erreichen. 🎜

🎜Vorteile von MVCC gegenüber Sperren🎜🎜🎜Sie können sich MVCC als einen Kompromiss der Sperrung auf Zeilenebene vorstellen, was nützlich ist In vielen Fällen wird die Verwendung von Sperren vermieden und der Overhead verringert. Abhängig von der Implementierung können nicht blockierende Lesevorgänge möglich sein, wobei beim Schreiben nur die erforderlichen Datensätze gesperrt werden. 🎜

MVCC的实现原理

MVCC的是通过保存数据澡某个时间点的快照来实现的,也就是说,不管事务执行多长的时间,每个事务看到的数据都是一致的。根据事务的开始时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。InnonDB主要通过为每一行记录添加两个额外的隐藏的值来实现MVCC,这两个值一个记录这行数据何时被创建,另外一个记录这行数据何时过期(或者被删除)。但是InnoDB并不存储这些事件发生时的 实际时间 ,相反它只存储这些事件发生时的系统 版本号(version) 。这是一个随着事务的创建而不断增长的数字。每个事务在事务开始时会记录它自己的系统版本号。每个查询必须去检查每行数据的版本号与事务的版本号是否相同。

《高性能MySQL》书籍中介绍到:

MVCC只在REPEATABLE READREAD COMMITTIED两个隔离级别下工作,其他两个隔离级别都和MVCC不兼容,因为READ UNCOMMITTED总是读取最新的数据行,而不符合当前事务版本数据行,而SERIALIZABLE串行化隔离级别则会对所有读取的行都加锁。

接下来举个例子说明在可重复读事务隔离级别下,MVCC机制是如何完成增删改查操作的。

  • 查询操作(SELECT)

在查询操作中,InnoDB存储引擎跟根据以下两个条件查询对应的行记录,只有满足对应条件才会被返回:

1️⃣ 只查找不晚于当前事务版本的数据行,也就是说,InnoDB存储引擎只会查找版本号小于或者等于当前事务版本的数据行,这些数据行要么在该事务开始前就存在,要么就是事务本身插入或者更新的行。
2️⃣ 对于数据删除,数据行删除的版本要么还没有被定义,要么大于当前事务的版本号,只有这样才能确保事务读到的行,在事务开始前并没有被删除。

举个例子,存在 事务A事务B 两个事务,事务A中存在两套相同的SELECT语句,事务B存在一条UPDATE语句,事务A 的第一条查询语句在事务B提交之前执行,第二条查询语句在 事务B 提交之后执行,事务A 如下所示:

-- 事务A操作
START TRANSACTION;
SELECT * FROM account WHERE id = 1;     //在事务B提交之前执行
SELECT * FROM account WHERE id = 1;     //在事务B提交之后执行
COMMIT;

事务B:

-- 事务B操作
START TRANSACTION;
UPDATE account SET balance = balance+100 WHERE id = 1;
COMMIT;

✔结论:如果没有使用MVCC机制,则事务A中的第一条SELECT语句读取的数据是修改前的数据,而第二条SELECT语句读取的是修改后的数据,两次读取的数据不一致,想想,那不就乱了吗?? 如果使用了MVCC机制,无论事务B如何修改数据,事务A的两条查询语句的到的结果始终是一致的。

  • 插入操作(SELECT)

在插入操作中,InnoDB会将新插入的每一条行记录的当前系统版本包保存为行版本号。

比如:向account表插入一条数据,同时MVCC的两个版本号分别为create_versiondelete_versioncreate_version代表创建行的版本号,delete_version代表删除行的版本号,另外还有一个事务ID字段,如下面所示:

INSERT INTO account(id, name, balance) values(1001, 'austin', 100);

对应的版本号信息如下表:

id name balance transaction_id create_version delete_version
1001 austin 100 1 1 未定义

可以看出,当向数据表新增记录时,需要设置保存行的版本号,而删除行的版本号未定义。

  • 更新操作(SELECT)

在更新操作中,InnoDB存储引擎会插入一行新记录,并保存当前系统的版本号为新记录行的版本号,同时保存当前系统的版本号到原来数据行作为删除标识。比如:将account数据表中id为1001的用户账户月增加100元,对应SQL如下:

UPDATE account SET balance = balance+100 WHERE id = 1001;

执行SQL, 在MVCC机制下的更新操作如下表所示:

id name balance transaction_id create_version delete_version
1001 austin 100 1 1 2
1001 austin 200 2 2 未定义

可以明显看出,执行更新操作时,MVCC机制是先将原来的数据复制一份,将balance字段增加100后,再讲create_version字段的值设置为当前系统的版本号,而delete_version字段的值未定义。

注意的是:原来的行会被复制到Undo Log中。

  • 删除操作(SELECT)

在删除操作中,InnoDB存储引擎会保存删除的每一个行记录当前的系统版本号,作为删除标识。比如:删除account数据表中id为1001的数据,SQL如下所示:

DELETE FROM account WHERE id = 1001;

对应MVCC机制下的删除操作如下表所示:

id name balance transaction_id create_version delete_version
1001 austin 200 3 2 3

可以看出,当删除数据表数据行时,MVCC机制会将当前系统的版本号写入删除数据行版本字段delete_version中,以此来表示当前数据行已经被删除。

六、总结

本文主要讲述了事务的特性、类型和本地事务和分布式事务的区别,通过不同的示例解释并发事务带来的更新丢失、脏读、不可重复读、幻读的问题,同时介绍了多版本并发控制MVCC的实现原理,如果文章对你有帮助,感谢点赞?+评论?+收藏❤,我是:?‍?austin流川枫,我们下期见!

【相关推荐:mysql视频教程

Das obige ist der detaillierte Inhalt vonLassen Sie uns ausführlich über Transaktionsfunktionen und Implementierungsprinzipien in MySQL sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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