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

May 28, 2023 pm 03:04 PM
mysql rc

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!

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

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT

Stock Market GPT

Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser une instruction de cas dans MySQL? Comment utiliser une instruction de cas dans MySQL? Sep 20, 2025 am 02:00 AM

La réponse est: l'instruction de cas de MySQL est utilisée pour implémenter la logique conditionnelle dans la requête, et prend en charge deux formulaires: simple et recherche. Différentes valeurs peuvent être renvoyées dynamiquement dans des clauses telles que Select, Where et OrderBy; Par exemple, dans SELECT, la classification des scores par segments fractionnaires, combinant des fonctions agrégées pour compter le nombre d'états, ou hiérarchiser les rôles spécifiques dans OrderBy, il est nécessaire de toujours terminer avec fin et il est recommandé d'utiliser d'autre pour gérer la situation par défaut.

Comment automatiser les sauvegardes MySQL avec un script? Comment automatiser les sauvegardes MySQL avec un script? Sep 21, 2025 am 02:24 AM

Créez un script shell contenant la configuration de la base de données et la commande mysqldump et enregistrez-le sous Mysql_backup.sh; 2. Stockez les informations d'identification MySQL en créant un fichier ~ / .my.cnf et définissez 600 autorisations pour améliorer la sécurité, modifier le script pour utiliser l'authentification du fichier de configuration; 3. Utilisez Chmod X pour rendre l'exécutable de script et tester manuellement si la sauvegarde est réussie; 4. Ajouter des tâches chronométrées via Crontab-E, telles que 02 / path / vers / mysql_backup.sh >> / path / to / backup / backup.log2> & 1, réalisez la sauvegarde automatique et la journalisation à 2 heures du matin tous les jours; 5

Comment mettre à jour une ligne s'il existe ou insérer si ce n'est dans MySQL Comment mettre à jour une ligne s'il existe ou insérer si ce n'est dans MySQL Sep 21, 2025 am 01:45 AM

INSERT ... L'implémentation OnDuplicateKeyupdate sera mise à jour si elle existe, sinon elle sera insérée et nécessite des contraintes de clé unique ou primaires; 2. Réinsert après la suppression de RemplaceInto, qui peut entraîner des modifications de l'ID d'incrémentation automatique; 3. L'insertion inserte uniquement et ne fait pas de données répétitives, et ne met pas à jour. Il est recommandé d'utiliser la première implémentation d'UPsert.

Comment utiliser des sous-requêtes dans MySQL? Comment utiliser des sous-requêtes dans MySQL? Sep 20, 2025 am 01:07 AM

Les sous-questionnaires peuvent être utilisés dans d'où, de sélection, de sélection et d'avoir des clauses pour implémenter le filtrage ou le calcul en fonction du résultat d'une autre requête. Les opérateurs tels que dans, tous, tous sont couramment utilisés dans où; Les alias sont nécessaires comme des tables dérivées de; Les valeurs uniques doivent être renvoyées dans Select; Les sous-requêtes apparentées reposent sur la requête extérieure pour exécuter chaque ligne. Par exemple, consultez les employés dont le salaire moyen est plus élevé que le ministère ou ajoutez la liste de salaire moyenne de l'entreprise. Les sous-questionnaires améliorent la clarté logique, mais les performances peuvent être inférieures à la jointure, vous devez donc vous assurer de retourner les résultats attendus.

Comment utiliser la commande Explication dans MySQL? Comment utiliser la commande Explication dans MySQL? Sep 18, 2025 am 01:48 AM

ExpliquerInmysqlRevealSQueryExecutionPlans, montrant IndexUsage, TablereadOrder, androwfilteringTooptimePerFormance; useitBereelectoAnalyzesteps, checkkeycolumnsliketypeAndrow

Comment sélectionner des valeurs distinctes dans MySQL? Comment sélectionner des valeurs distinctes dans MySQL? Sep 16, 2025 am 12:52 AM

Utilisez le mot clé distinct pour supprimer les valeurs en double de la colonne spécifiée et renvoyez des valeurs uniques. 1. La syntaxe de base est SelectDistinctColumn_NameFromTable_name; 2. Interrogez la valeur unique d'une seule colonne, telle que SelectDistinctCityFromCustomesrs; 3. Interrogez la combinaison unique de plusieurs colonnes, telles que SelectDistinctCity, StateFromCustomesrs; 4. Filtrez avec la clause WHERE et obtenez la valeur unique, comme selectDistinctProduct_namefromorderswhereOrder_Date> '202

Comment calculer la distance entre deux points dans MySQL Comment calculer la distance entre deux points dans MySQL Sep 21, 2025 am 02:15 AM

MySQL peut calculer les distances géographiques à travers la formule Haversine ou la fonction ST_DISTANCE_SPHERE. Le premier convient à toutes les versions, et le second fournit des calculs de distance sphérique plus faciles et plus précis depuis 5.7.

Comment gérer les fuseaux horaires dans MySQL? Comment gérer les fuseaux horaires dans MySQL? Sep 20, 2025 am 04:37 AM

Utilisez UTC pour stocker le temps, définissez le fuseau horaire MySQL Server sur UTC, utilisez l'horodatage pour réaliser la conversion automatique du fuseau horaire, ajustez le fuseau horaire en fonction des besoins des utilisateurs dans la session, affichez le temps local via la fonction convert_tz et assurez-vous que le tableau de fuseau horaire est chargé.

See all articles