Maison > base de données > tutoriel mysql > le corps du texte

Un article sur l'insertion d'un verrou d'intention dans MySQL

青灯夜游
Libérer: 2023-01-23 05:30:01
avant
3064 Les gens l'ont consulté

Insert Intention Lock, nous l'appelons également Insert Intention Lock en chinois. Il s'agit d'un type de verrouillage d'espacement, spécifiquement pour les opérations d'insertion. La signification officielle est que lorsque plusieurs transactions insèrent des enregistrements dans le même index et la même plage, si les positions d'insertion n'entrent pas en conflit, elles ne se bloqueront pas. L'article suivant vous fera comprendre le verrouillage d'intention d'insertion dans MySQL. J'espère qu'il vous sera utile !

Un article sur l'insertion d'un verrou d'intention dans MySQL

Insert Intention Lock, nous l'appelons également Insert Intention Lock en chinois.

Cela peut être considéré comme un complément au Gap Lock dont nous avons parlé précédemment. Concernant le Gap Lock, si vous ne comprenez toujours pas, vous pouvez vous référer à : Record Lock, Gap Lock et Next-Key Locks.

1. Pourquoi devons-nous insérer un verrouillage d'intention ?

Nous avions déjà Gap Lock auparavant. Cela peut nous aider à résoudre le problème de lecture fantôme dans une certaine mesure, mais le précédent semble avoir quelques problèmes.

Supposons que j'ai le tableau suivant :

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Copier après la connexion

id est une clé primaire auto-incrémentée ; l'âge est un index commun. Il y a maintenant les données suivantes dans le tableau :

Supposons que je veuille exécuter l'insertion suivante. SQL :

begin;insert into user(username,age) values('wangwu',95);复制代码
Copier après la connexion

Remarque, ce SQL a été exécuté mais la transaction n'a pas encore été validée.

Selon les connaissances que nous avons acquises auparavant sur Gap Lock, la plage de Gap Lock à l'heure actuelle est de (89,99), ce qui signifie qu'aucun âge dans cette plage ne peut être inséré.

Si tel est le cas, vos amis trouveront que l'efficacité de l'insertion des données est trop faible et que des conflits de verrouillage sont susceptibles de se produire. Alors, que devons-nous faire ?

Le verrouillage d'intention d'insertion que nous allons présenter aujourd'hui est utilisé pour résoudre ce problème.

2. Qu'est-ce qu'un verrou d'intention d'insertion

Jetons un coup d'œil à l'introduction sur le site officiel de MySQL :

Un verrou d'intention d'insertion est un type de verrouillage d'espacement défini par les opérations INSERT avant l'insertion de ligne. lock signale l'intention d'insérer de telle manière que plusieurs transactions insérées dans le même espace d'index n'ont pas besoin de s'attendre si elles ne sont pas insérées à la même position dans l'espace. Supposons qu'il existe des enregistrements d'index avec des valeurs de 4. et 7. Les transactions séparées qui tentent d'insérer des valeurs de 5 et 6, respectivement, verrouillent chacune l'espace entre 4 et 7 avec des verrous d'intention d'insertion avant d'obtenir le verrou exclusif sur la ligne insérée, mais ne se bloquent pas car le les lignes ne sont pas en conflit.

traduit grossièrement La chose suivante est comme ceci :

Le verrou d'intention d'insertion est une sorte de verrou d'espacement défini avant l'opération INSERT. Le verrou d'intention d'insertion représente une intention d'insertion, c'est-à-dire lorsque plusieurs transactions différentes. vont au même index du même index en même temps lors de l'insertion de données dans l'espace, ils n'ont pas besoin de s'attendre, c'est-à-dire qu'ils ne se bloqueront pas (si vous suivez simplement la théorie précédente du verrouillage de l'espace, vous devez attendre qu'un verrou d'espace soit libéré avant que la prochaine transaction puisse insérer des données dans le même espace). Supposons qu'il existe des enregistrements d'index avec les valeurs 4 et 7. Il y a maintenant deux transactions essayant d'insérer des enregistrements avec les valeurs 5 et 6 respectivement. Chaque transaction utilise un verrou d'intention d'insertion pour verrouiller entre 4 et 7 avant d'obtenir un verrou exclusif. la ligne insérée, mais les deux transactions ne se bloqueront pas car les lignes ne sont pas en conflit.

Il s'agit d'insérer le verrou d'intention.

3. Pratique

Amis, veuillez noter que Brother Song a déjà parlé de Gap Lock avec tout le monde et a dit qu'il s'agit d'un produit unique sous le niveau d'isolement de REPEATABLE READ, alors maintenant, Insert Intention Lock est un Gap Lock spécial. , bien sûr, prend également effet sous le niveau d'isolement de lecture répétable.

Ensuite, nous démontrerons l'insertion du verrouillage d'intention à travers deux cas simples.

3.1 Cas 1

La structure et les données de notre tableau sont cohérentes avec la première section.

Nous exécutons d'abord le code suivant dans la session A :

Maintenant, la transaction dans la session A n'est pas validée.

Ensuite, nous effectuons également une opération d'insertion dans la session B :

Nous avons constaté que la session B peut également être exécutée normalement sans blocage.

Cela montre que les deux verrous d'intention d'insertion sont compatibles et peuvent coexister.

3.2 Cas 2

Regardons un autre exemple incompatible.

Exécutez d'abord le SQL suivant dans la session A pour interroger les enregistrements dont l'âge est supérieur à 80 et ajoutez un verrou exclusif :

Ensuite, dans la session B, exécutez le code suivant pour insérer une ligne de données :

Les amis, voyez-vous, cette opération sera bloquée ! La raison du blocage est que le verrou d'intention d'insertion et le verrou exclusif s'excluent mutuellement.

Profitant de la situation de blocage, dans la session C, nous utilisons la commande show engine innodb statusG utilisée dans l'article précédent pour vérifier la situation de verrouillage, en nous concentrant sur le nœud TRANSACTION :

Dans le contenu de sortie, l'endroit où le rouge La case est cochée indique clairement l’existence du verrou d’intention d’insertion.

4. Résumé

Pour résumer :

  • Insérer un verrou d'intention Bien que le mot intention soit dans le nom, il s'agit en fait d'un verrou d'espacement spécial.

  • Les verrous d'intention d'insertion ne s'excluent pas mutuellement.

  • Insérez une exclusion mutuelle entre le verrouillage d'intention et le verrouillage exclusif.

D'accord, si vous avez des questions, veuillez laisser un message pour en discuter.

【Recommandations associées : tutoriel vidéo 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!

Étiquettes associées:
source:juejin.cn
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