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.
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
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.
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.4. Protokollversionskette rückgängig machenWenn Transaktionen die Zeile ändern, wird kontinuierlich ein Rückgängig-Protokoll generiert und schließlich eine Rückgängig-Protokoll-Versionskette gebildet.
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;
INSERT INTO student VALUES ( 1, "a", 24 );
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;
Wenn die dritte Transaktion geöffnet wird und die zugewiesene Transaktions-ID 3 ist, führen Sie den folgenden Änderungsbefehl aus.
UPDATE student SET age = 25 WHERE id = 1;
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.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
Die Funktion von ReadView besteht darin, zu bestimmen, welche Daten in der Rückgängig-Protokoll-Versionskette für die aktuelle Transaktion sichtbar sind.
ReadView enthält die folgenden wichtigen Parameter:m_ids中的最小值
max_trx_id
mysql即将为下一个事务分配的事务id,并不是m_ids中的最大值。
creator_trx_id
即创建此ReadView的事务id
简要的示意图如下:
那么事务在执行快照读时,可以通过以下的规则来确定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!