Heim  >  Artikel  >  Datenbank  >  Was ist der MVCC-Mechanismus in MySQL?

Was ist der MVCC-Mechanismus in MySQL?

PHPz
PHPznach vorne
2023-06-03 09:41:161665Durchsuche

1. Übersicht:

MVCC, der vollständige Name ist Multi-Version Concurrency Control, was eine Parallelitätskontrolle mit mehreren Versionen bedeutet. MVCC ist eine Methode zur Steuerung mehrerer Parallelitäten. Sie wird im Allgemeinen in Datenbankverwaltungssystemen verwendet, um gleichzeitigen Zugriff auf die Datenbank zu erreichen und Transaktionsspeicher in Programmiersprachen zu implementieren.
Wir wissen, dass MySql nach 5.5 von der MyISAM-Speicher-Engine zur InnoDB-Speicher-Engine gewechselt ist, hauptsächlich weil InnoDB Transaktionen unterstützt. Wenn also mehrere Threads gleichzeitig ausgeführt werden, kann es zu Parallelitätsproblemen kommen. Zu diesem Zeitpunkt erscheint möglicherweise eine Methode, die die Parallelität steuern kann, und MVCC spielt diese Rolle.

MVCC wird hauptsächlich durch Rückgängigmachen der Protokollversionskette und ReadView implementiert.

2. Was ist das Rückgängig-Protokoll?

  • Das Rückgängig-Protokoll wird hauptsächlich zum Wiederherstellen der ursprünglichen Daten verwendet, wenn eine Transaktion zurückgesetzt wird.

  • Wenn MySQL SQL ausführt, wird das logisch entgegengesetzte Protokoll des Tages im Rückgängig-Protokoll gespeichert. Daher handelt es sich bei dem, was im Rückgängig-Protokoll aufgezeichnet wird, auch um ein logisches Protokoll.

  • Aber wenn MySQL die Insert-Anweisung ausführt, wird die Primärschlüssel-ID dieser Einfügung im Rückgängig-Protokoll aufgezeichnet. Wenn die Transaktion zurückgesetzt wird, löscht „Löschen“ diese ID.

  • Beim Ausführen der Update-Anweisung speichert MySQL die Daten vor der Änderung im Rückgängig-Protokoll. Wenn die Transaktion zurückgesetzt wird, wird die Aktualisierung erneut durchgeführt, um die Originaldaten zu erhalten.

  • Wenn MySQL die Löschanweisung ausführt, werden die Daten vor dem Löschen im Rückgängig-Protokoll gespeichert. Wenn die Transaktion zurückgesetzt wird, führen Sie das Einfügen erneut aus und fügen Sie die Originaldaten ein.

  • Die vier Hauptmerkmale der Datenbank sind Atomizität, dh Transaktionen sind unteilbar, entweder alle sind erfolgreich oder alle schlagen fehl, und die unterste Ebene wird durch das Rückgängig-Protokoll erreicht. Wenn die Ausführung einer bestimmten Anweisung fehlschlägt, werden die Anweisungen der vorherigen Transaktion zurückgesetzt. 3. Verborgene Spalten von Zeilen

Wenn die aktuelle Tabelle einen Primärschlüssel vom Typ Ganzzahl hat, ist der Wert von row_id der Wert des Primärschlüssels.
    Wenn kein Primärschlüssel vom Typ Ganzzahl vorhanden ist, wählt MySQL einen nicht leeren eindeutigen Index vom Typ Ganzzahl aus row_id in der Reihenfolge der Felder
  • Wenn keines von beiden gefunden wird, wird eine automatisch wachsende Ganzzahl als row_id erstellt

  • trx_id, Transaktionsnummer:

Wenn die Ausführung einer Transaktion beginnt, weist MySQL eine globale zu Automatische Erhöhung der Transaktion zur Transaktions-ID.
Wenn die Transaktion anschließend Vorgänge wie das Hinzufügen, Ändern oder Löschen der aktuellen Transaktion ausführt, zeichnet sie ihre eigene Transaktions-ID in trx_id auf.

  • roll_pointer, Rollback-Zeiger:

Wenn eine Transaktion die aktuellen Daten ändert, werden die alten Daten im Rückgängig-Protokoll aufgezeichnet und die Daten werden in die aktuelle Zeile und die aktuellen roll_pointer-Punkte geschrieben zum gerade rückgängig gemachten Protokoll, sodass die vorherige Version über roll_pointer gefunden werden kann.

Wenn Transaktionen die Zeile ändern, wird kontinuierlich ein Rückgängig-Protokoll generiert und schließlich eine Rückgängig-Protokoll-Versionskette gebildet.

4. Protokollversionskette rückgängig machen
  • Zu Beginn verwenden wir die folgende Anweisung, um eine Standardtabelle zu erstellen

    CREATE TABLE `student` (
    	`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
    	`name` VARCHAR ( 255 ) NOT NULL,
    	`age` INT ( 11 ) NOT NULL,
      PRIMARY KEY ( `id` ) USING BTREE 
    ) ENGINE = INNODB;

    Öffnen Sie nun die erste Transaktion, die Transaktions-ID ist 1, und führen Sie die folgende Einfügeanweisung aus.
  • INSERT INTO student VALUES ( 1, "a", 24 );
Dann sieht das aktuelle Diagramm wie folgt aus:


Da die Daten neu eingefügt werden, ist das Rückgängig-Protokoll, auf das der roll_pointer zeigt, leer.

Öffnen Sie dann die zweite Transaktion, die zugewiesene Transaktions-ID ist 2, und führen Sie den folgenden Änderungsbefehl aus.

UPDATE student SET NAME = 'b' WHERE id = 1;

Das aktuelle Diagramm ändert sich zu:

Wenn die dritte Transaktion geöffnet wird und die zugewiesene Transaktions-ID 3 ist, führen Sie den folgenden Änderungsbefehl aus. Was ist der MVCC-Mechanismus in MySQL?

UPDATE student SET age = 25 WHERE id = 1;

Das Diagramm wird zu:

Wenn jede Transaktion die Zeile ändert, wird ein Rückgängig-Protokoll generiert, um die vorherige Version zu speichern und dann die neue Version von roll_pointer auf das gerade generierte Rückgängig-Protokoll zu verweisen.

Daher kann roll_pointer diese verschiedenen Versionen von Undo-Logs in Reihe verbinden, um eine Versionskette von Undo-Logs zu bilden.

Was ist der MVCC-Mechanismus in MySQL?5. Über ReadView

Zuallererst müssen Sie das Lesen von Schnappschüssen und das Lesen von Schnappschüssen verstehen: Einfache Auswahlabfrage, die keine Auswahl von … zum Aktualisieren enthält Verlauf der Datenversion.

Aktuelles Lesen: Die folgenden Anweisungen sind alle aktuellen Lesevorgänge, lesen immer die neueste Version und sperren die zuletzt gelesene Version.

select ... lock in share mode
select ... for update
insert
update
delete

Wenn eine Transaktion jeden Snapshot-Lesevorgang durchführt oder wenn eine Transaktion zum ersten Mal einen Snapshot-Lesevorgang durchführt, wird eine konsistente Ansicht, nämlich ReadView, generiert.

Die Funktion von ReadView besteht darin, zu bestimmen, welche Daten in der Rückgängig-Protokoll-Versionskette für die aktuelle Transaktion sichtbar sind. Was ist der MVCC-Mechanismus in MySQL?

ReadView enthält die folgenden wichtigen Parameter:


m_ids



Zum Zeitpunkt der Erstellung von ReadView handelt es sich um die Sammlung aller nicht festgeschriebenen Transaktions-IDs in MySQL.


min_trx_id
    • m_ids中的最小值

  • max_trx_id

    • mysql即将为下一个事务分配的事务id,并不是m_ids中的最大值。

  • creator_trx_id

    • 即创建此ReadView的事务id

简要的示意图如下:

Was ist der MVCC-Mechanismus in MySQL?

那么事务在执行快照读时,可以通过以下的规则来确定undo log版本链上的哪个版本数据可见。

  • 如果当前undo log的版本的trx_id

  • 如果当前undo log的版本的trx_id≥max_trx_id,说明该版本对应的事务在生成ReadView之后才开始的,因此是不可见的。

  • 如果当前undo log的版本的trx_id∈[min_trx_id,max_trx_id),如果在这个范围里,还要判断trx_id是否在m_ids中:

  在m_ids中,说明版本对应的事务未提交,因此是不可见的。

  不在m_ids中,说明版本对应的事务已经提交,因此是可见的。
  • 如果当前undo log的版本的trx_id=creator_trxt_id,说明事务正在访问自己修改的数据,因此是可见的。

  • 当undo log版本链表的头结点数据被判定为不可见时,则利用roll_pointer找到上一个版本,再进行判断。如果整个链表中都没有找到可见的数据,则代表当前的查询找不到数据。

Das obige ist der detaillierte Inhalt vonWas ist der MVCC-Mechanismus in MySQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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