Maison  >  Article  >  base de données  >  Un article pour parler du verrouillage d'intention d'insertion dans MySQL

Un article pour parler du verrouillage d'intention d'insertion dans MySQL

青灯夜游
青灯夜游original
2022-12-21 20:56:302122parcourir

Dans cet article, nous parlerons du verrou d'intention d'insertion dans MySQL et présenterons ce qu'est le verrou d'intention d'insertion ? Pourquoi dois-je insérer un verrou d’intention ? J'espère que cela aidera tout le monde !

Un article pour parler du verrouillage d'intention d'insertion 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, qui peut nous aider à résoudre le problème de lecture fantôme dans une certaine mesure.

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;

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);

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 la requête SQL suivante 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, vous voyez que 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 insérés 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.

【Recommandation associée : 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!

Déclaration:
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