Maison > base de données > tutoriel mysql > Comment MySQL implémente l'isolation des transactions RC

Comment MySQL implémente l'isolation des transactions RC

PHPz
Libérer: 2023-05-28 15:04:49
avant
1712 Les gens l'ont consulté

Le mécanisme ReadView est un mécanisme de vue en lecture basé sur la chaîne de version du journal d'annulation. Chaque transaction générera un ReadView

  • Si les données sont mises à jour par la transaction elle-même, vous pouvez la lire vous-même

  • ou quand. vous le générez ReadViewLa valeur modifiée par la transaction soumise auparavant peut également être lueReadView之前提交的事务所修改的值,也可读到

  • 但若你生成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:

Comment MySQL implémente lisolation des transactions RC

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

Comment MySQL implémente lisolation des transactions RC

这时事务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

Mais si vous générez ReadView, c'est déjà une transaction active, mais si elle modifie les données après avoir généré ReadView , il ne sera pas lu, vous ne pouvez pas le lire pour le moment

🎜🎜ou vous avez généré ReadView puis ouvert la transaction après avoir modifié les données et l'avez soumise, mais vous pouvez. Je ne le lis pas non plus🎜🎜🎜🎜Donc le mécanisme ci-dessus C'est un principe de ReadView Comment implémenter RC basé sur ReadView ? Conception de base : lorsqu'une transaction définit RC, elle régénérera un ReadView à chaque fois qu'elle lancera une requête ! 🎜🎜🎜Il y a une ligne de données dans la base de données, qui est une transaction avec l'identifiant de transaction=50. Elle a été insérée il y a longtemps. La transaction active actuelle est : 🎜🎜🎜🎜🎜Transaction A (id=60) 🎜. 🎜🎜🎜Transaction B (id=70) 🎜🎜🎜🎜🎜Maintenant, la transaction B lance une mise à jour et met à jour ces données en b, donc à ce moment-là, le trx_id des données deviendra l'id=70 de la transaction B, et une annulation log est généré en même temps : 🎜🎜🎜Comment MySQL implémente-t-il l'isolation des transactions RC 🎜🎜À ce moment, si la transaction A souhaite lancer une opération de requête, elle générera un ReadView🎜🎜Comment MySQL implémente-t-il l'isolation des transactions RC🎜🎜À ce moment-là, la transaction A a lancé une requête et a constaté que le trx_id=70 de la donnée actuelle. Autrement dit, entre les plages d'identifiants de transaction appartenant à ReadView, cela signifie qu'il y avait cette transaction active avant qu'elle ne génère ReadView. C'est cette transaction qui a modifié la valeur de ces données, mais la transaction B n'a pas encore été soumise, donc. la liste des transactions actives m_ids de ReadView Ici, il y a deux ID [60, 70]. A ce moment, selon le mécanisme ReadView, la transaction A ne trouve pas la valeur b modifiée par la transaction B. 🎜🎜 Ensuite, recherchez dans la chaîne de version du journal d'annulation et vous trouverez une valeur originale et constaterez que son trx_id est de 50, ce qui est plus petit que le min_trx_id dans le ReadView actuel. Cela signifie qu'avant de générer le ReadView, une transaction a été insérée. cette valeur et elle a été soumise il y a longtemps, cette valeur originale peut donc être trouvée. 🎜🎜Supposons que la transaction B ait été validée, ce qui signifie qu'il ne s'agit plus d'une transaction active dans la base de données. La prochaine fois que la transaction A interrogera, elle pourra lire la valeur modifiée de la transaction B. Alors, comment la transaction A peut-elle lire la valeur modifiée de la transaction B soumise ? 🎜🎜🎜Laissez la transaction A lancer une requête la prochaine fois et générer un ReadView. La seule transaction active dans la base de données est la transaction A. Par conséquent : 🎜🎜🎜🎜🎜min_trx_id est 60🎜🎜🎜🎜mac_trx_id est 71🎜🎜🎜🎜<code>m_ids=60, l'id=70 de la transaction B n'apparaîtra pas dans la liste des transactions actives m_ids🎜🎜🎜🎜À ce stade time transaction Une requête basée à nouveau sur ce ReadView, et vous constaterez que le trx_id de ces données est 70. Bien qu'il se situe entre la plage min_trx_id et max_trx_id de ReadView, il ne figure pas dans la liste m_ids pour le moment, indiquant que la transaction B a été soumis avant de générer ce ReadView. Lorsque vous effectuez une opération de requête, vous pourrez voir l'opération de mise à jour effectuée par la transaction B, ce qui permettra à la transaction A d'obtenir la valeur B. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal