Heim >Datenbank >MySQL-Tutorial >Wie MySQL die RC-Transaktionsisolation implementiert

Wie MySQL die RC-Transaktionsisolation implementiert

PHPz
PHPznach vorne
2023-05-28 15:04:491714Durchsuche

Der ReadView-Mechanismus ist ein Leseansichtsmechanismus, der auf der Rückgängig-Protokollversionskette basiert.

  • Wenn die Daten durch die Transaktion selbst aktualisiert werden, können Sie sie selbst lesen

  • oder zu einem bestimmten Zeitpunkt generieren Sie ReadViewDer durch die zuvor übermittelte Transaktion geänderte Wert kann auch gelesen werdenReadView之前提交的事务所修改的值,也可读到

  • 但若你生成ReadView时,就已经活跃的事务,但如果它在你生成ReadView之后修改的数据并提交了,此时你读不到

  • 或你生成ReadView以后再开启的事务修改了数据,还提交了,也读不到

所以上面那套机制就是ReadView的一个原理如何基于ReadView实现RC?核心设计:当一个事务设置RC,他是每次发起查询,都重新生成一个ReadView!

数据库里有一行数据,是事务id=50的一个事务,很久以前就插入的,当前活跃事务:

  • 事务A(id=60)

  • 事务B(id=70)

现在事务B发起update,更新这条数据为b,所以此时数据的trx_id会变为事务B的id=70,同时生成一条undo log:

Wie MySQL die RC-Transaktionsisolation implementiert

这时,事务A要发起一次查询操作,就会生成一个ReadView

Wie MySQL die RC-Transaktionsisolation implementiert

这时事务A发起查询,发现当前这条数据的trx_id=70。即属于ReadView的事务id范围之间,说明是他生成ReadView之前就有这个活跃的事务,是这个事务修改了这条数据的值,但此时事务B还没提交,所以ReadView的m_ids活跃事务列表里,有[60, 70]两个id,此时根据ReadView机制,事务A无法查到事务B修改的值b。

接着就顺着undo log版本链条往下查找,就会找到一个原始值,发现其trx_id是50,小于当前ReadView里的min_trx_id,说明是他生成ReadView之前,就有一个事务插入了这个值并且早就提交了,因此可以查到这个原始值。

假设事务B已提交,这意味着它不再是数据库中的活跃事务。事务A下次再查询,就可以读到事务B修改过的值了。那到底是怎么让事务A能够读到提交的事务B修改过的值呢?

让事务A下次发起查询,再生成一个ReadView,数据库内活跃的事务只有事务A,因此:

  • min_trx_id是60

  • mac_trx_id是71

  • m_ids=60,事务B的id=70不会出现在m_ids

Aber wenn Sie ReadView generieren, ist es bereits eine aktive Transaktion, aber wenn es die Daten ändert, nachdem Sie ReadView generiert haben, ist es Wird nicht gelesen. Sie können es derzeit nicht lesen. Oder Sie haben ReadView generiert und dann die Transaktion geöffnet, nachdem Sie die Daten geändert haben, und sie gesendet, aber Sie können es nicht lesen Lesen Sie es entweder

🎜🎜Der obige Mechanismus ist also ein Prinzip von ReadView. Wie implementiert man RC basierend auf ReadView? Kerndesign: Wenn eine Transaktion RC festlegt, generiert sie jedes Mal, wenn sie eine Abfrage initiiert, eine ReadView neu! 🎜🎜🎜Es gibt eine Datenzeile in der Datenbank, bei der es sich um eine Transaktion mit der Transaktions-ID=50 handelt. Sie wurde vor langer Zeit eingefügt: 🎜🎜🎜🎜🎜Transaktion A (ID=60) 🎜 🎜🎜🎜Transaktion B (id=70) 🎜🎜🎜🎜🎜Jetzt initiiert Transaktion B eine Aktualisierung und aktualisiert diese Daten auf b, sodass zu diesem Zeitpunkt die trx_id der Daten zur id=70 von Transaktion B wird und ein Rückgängigmachen erfolgt Gleichzeitig wird ein Protokoll generiert: 🎜🎜🎜Wie implementiert MySQL die RC-Transaktionsisolation? 🎜🎜Wenn Transaktion A zu diesem Zeitpunkt einen Abfragevorgang initiieren möchte, wird eine ReadView generiert🎜🎜Wie implementiert MySQL die RC-Transaktionsisolation🎜🎜Zu diesem Zeitpunkt initiierte Transaktion A eine Abfrage und stellte fest, dass trx_id=70 des aktuellen Datenelements. Das heißt, es gehört zum Transaktions-ID-Bereich von ReadView, was bedeutet, dass es diese aktive Transaktion gab, bevor sie ReadView generierte. Diese Transaktion hat den Wert dieser Daten geändert, aber Transaktion B wurde zu diesem Zeitpunkt noch nicht übermittelt. also die m_ids aktive Transaktionsliste von ReadView Hier gibt es zwei IDs [60, 70]. Gemäß dem ReadView-Mechanismus kann Transaktion A den durch Transaktion B geänderten Wert b nicht finden. 🎜🎜 Durchsuchen Sie dann die Versionskette des Rückgängig-Protokolls, und Sie werden einen Originalwert finden und feststellen, dass seine trx_id 50 ist, was kleiner ist als die min_trx_id in der aktuellen ReadView. Dies bedeutet, dass vor der Generierung der ReadView eine Transaktion eingefügt wurde Dieser Wert wurde vor langer Zeit übermittelt, sodass dieser ursprüngliche Wert gefunden werden kann. 🎜🎜Angenommen, Transaktion B wurde festgeschrieben, was bedeutet, dass es sich nicht länger um eine aktive Transaktion in der Datenbank handelt. Wenn Transaktion A das nächste Mal eine Abfrage durchführt, kann sie den geänderten Wert von Transaktion B lesen. Wie kann also Transaktion A den geänderten Wert der übermittelten Transaktion B lesen? 🎜🎜🎜Lassen Sie Transaktion A das nächste Mal eine Abfrage initiieren und eine ReadView generieren. Die einzige aktive Transaktion in der Datenbank ist Transaktion A. Daher: 🎜🎜🎜🎜🎜min_trx_id ist 60🎜🎜🎜🎜mac_trx_id ist 71 Zeittransaktion Eine erneute Abfrage basierend auf dieser ReadView, und Sie werden feststellen, dass die trx_id dieser Daten 70 ist. Obwohl sie zwischen dem min_trx_id- und max_trx_id-Bereich der ReadView liegt, befindet sie sich zu diesem Zeitpunkt nicht in der m_ids-Liste, was auf diese Transaktion hinweist B wurde vor der Generierung dieser ReadView übermittelt. Wenn Sie einen Abfragevorgang ausführen, können Sie den von Transaktion B durchgeführten Aktualisierungsvorgang sehen, der dazu führt, dass Transaktion A den Wert B erhält. 🎜

Das obige ist der detaillierte Inhalt vonWie MySQL die RC-Transaktionsisolation implementiert. 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