Le MVCC d'InnoDB est implémenté en enregistrant deux colonnes cachées derrière chaque ligne d'enregistrements. Parmi ces deux colonnes, l’une contient l’heure de création de la ligne et l’autre l’heure d’expiration (ou l’heure de suppression) de la ligne. Bien entendu, ce qui est stocké n’est pas la valeur temporelle réelle, mais le numéro de version du système. Chaque fois qu'une nouvelle transaction est démarrée, le numéro de version du système est automatiquement incrémenté. Le numéro de version du système au début de la transaction sera utilisé comme numéro de version de la transaction, qui est utilisé pour comparer avec le numéro de version de chaque ligne d'enregistrements interrogés. Voyons comment MVCC fonctionne sous le niveau d'isolement de lecture répétable.
InnoDB vérifiera chaque enregistrement de ligne selon les deux conditions suivantes
a InnoDB recherche uniquement les lignes de données dont la version est antérieure à la transaction en cours. version (c'est-à-dire que le numéro de version système de la ligne est inférieur ou égal au numéro de version système de la transaction), cela garantit que les lignes lues par la transaction existent déjà avant le démarrage de la transaction, ou ont été insérées ou modifié par la transaction elle-même.
b. La version supprimée de la ligne est soit indéfinie, soit supérieure au numéro de version actuel de la transaction. Cela garantit que les lignes lues par la transaction n'ont pas été supprimées avant le démarrage de la transaction.
Seuls les enregistrements qui remplissent les deux conditions ci-dessus peuvent être renvoyés comme résultats de requête.
InnoDB enregistre le numéro de version actuel du système comme numéro de version de ligne pour chaque ligne nouvellement insérée
InnoDB enregistre le numéro de version actuel du système pour chaque ligne supprimée, le numéro de version du système sert d'identifiant de suppression de ligne.
InnoDB insère une nouvelle ligne d'enregistrements, enregistre le numéro de version actuel du système en tant que numéro de version de la ligne et enregistre le numéro de version actuel du système dans la ligne d'origine en tant qu'identifiant de suppression de ligne.
Enregistrez ces deux numéros de version supplémentaires du système afin que la plupart des opérations de lecture puissent être effectuées sans verrouillage. Cette conception rend l'opération de lecture des données très simple, les performances sont très bonnes et garantit également que seules les lignes répondant aux normes sont lues. L'inconvénient est que chaque ligne d'enregistrements nécessite un espace de stockage supplémentaire, davantage de vérifications de lignes et des travaux de maintenance supplémentaires.
MVCC ne fonctionne que sous les deux niveaux d'isolement REPEATABLE READ et READ COMMITTED. Les deux autres niveaux d'isolement sont incompatibles avec MVCC car READ UNCOMMITTED lit toujours la dernière ligne de données, et non la ligne de données conforme à la version actuelle de la transaction. SERIALIZABLE verrouille toutes les lignes lues.
Recommandations d'apprentissage associées :base de données mysql
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!