Maison >base de données >tutoriel mysql >Quel est le principe de mise en œuvre du verrouillage mysql au niveau des lignes ?

Quel est le principe de mise en œuvre du verrouillage mysql au niveau des lignes ?

coldplay.xixi
coldplay.xixioriginal
2020-10-26 15:47:236101parcourir

Principe d'implémentation du verrouillage au niveau des lignes MySQL : 1. Le verrouillage des lignes InnoDB est implémenté en verrouillant les éléments d'index. C'est la différence entre MySQL et. Oracle est différent ; 2. InnoDB détermine que les verrous au niveau de la ligne ne peuvent être utilisés que pour récupérer des données via des conditions d'index. Utilisez directement les verrous au niveau de la table.

Quel est le principe de mise en œuvre du verrouillage mysql au niveau des lignes ?

Principe d'implémentation du verrouillage au niveau des lignes MySQL :

Le verrouillage est utilisé pour limiter de force l'accès aux ressources lors de l'exécution de plusieurs threads Mécanisme de synchronisation, les verrous de base de données peuvent être divisés en verrous au niveau de la ligne en fonction de la granularité du verrouillage. Verrous au niveau de la table et des verrous au niveau de la page

Verrous au niveau des lignes

Les verrous au niveau des lignes sont le mécanisme de verrouillage le plus granulaire de MySQL, ce qui signifie que seuls les verrous au niveau des lignes sont actuellement opéré La ligne est verrouillée et un conflit de verrouillage au niveau de la ligne se produit. La probabilité est très faible, sa granularité est la plus faible, mais le coût du verrouillage est le plus élevé. Les verrous au niveau des lignes sont divisés en verrous partagés et verrous exclusifs.

Caractéristiques :

Surcharge élevée, verrouillage lent, des blocages peuvent se produire ; la granularité du verrouillage est minime, les conflits de verrouillage sont les plus susceptibles de se produire et la concurrence est élevée

Principe d'implémentation :

Le verrouillage des lignes InnoDB est implémenté en verrouillant les éléments d'index. Ceci est différent de MySQL et Oracle. Ce dernier est implémenté en verrouillant les éléments d'index dans la base de données. Ceci est réalisé en verrouillant les lignes de données correspondantes. Le verrouillage au niveau des lignes d'InnoDB détermine que les lignes ne peuvent être utilisées que pour récupérer des données via des conditions d'index. Verrouillage de niveau, sinon, utilisez directement le verrouillage au niveau de la table.

Remarque particulière : Lorsque vous utilisez des verrous au niveau des lignes, vous devez utiliser des index

Par exemple :

Créer une structure de table

CREATE TABLE `developerinfo` (
  `userID` bigint(20) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `passWord` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`userID`),
  KEY `PASSWORD_INDEX` (`passWord`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Insérer des données

INSERT INTO `developerinfo` VALUES ('1', 'liujie', 

'123456');
INSERT INTO `developerinfo` VALUES ('2', 'yitong', '123');
INSERT INTO `developerinfo` VALUES ('3', 'tong', 

'123456');
(1) Interrogez la base de données via l'index de clé primaire et utilisez les verrous de ligne

Ouvrez trois fenêtres de ligne de commande pour les tests

Fenêtre de ligne de commande 1 Fenêtre de ligne de commande 2 Fenêtre de ligne de commande 3
mysql> set autocommit = 0;
Requête OK, 0 lignes affectées
mysql> sélectionnez * dans Developerinfo où userid = '1' pour mise à jour ;
+-------- +--------+----------+
| ID utilisateur | mot de passe |
+--- -----+-------- +----------+
| 1 | liujie 123456 |
+-------- +--------+----------+
1 ligne dans l'ensemble
mysql> = 0;
Requête OK, 0 lignes affectées

mysql> sélectionnez * dans Developerinfo où userid = '1' pour mise à jour ;

Attendez

mysql> set autocommit = 0;
Requête OK, 0 lignes affecté
mysql> sélectionnez * dans Developerinfo où userid = '3' pour mise à jour;
+--------+------+---------+
| nom d'utilisateur | mot de passe |
+--- ----- +------+----------+
| 3 | pince | 123456 |
+-------- +------+----------+
1 ligne dans l'ensemble
mysql> commit ;
Requête OK, 0 lignes affectées
mysql> Developerinfo où userid = '1' pour la mise à jour ;
+--------+-------- +----------+
| nom d'utilisateur | mot de passe |
+--------+--- ----- +----------+
| 1 | liujie 123456 |
+-------- +--------+----------+
1 rangée dans l'ensemble


(2) Interroger des champs non indexés pour interroger la base de données à l'aide de verrous de ligne

Ouvrez deux fenêtres de ligne de commande pour tester

命令行窗口1 命令行窗口2
mysql> set autocommit=0;
Query OK, 0 rows affected
mysql> select * from developerinfo where name = 'liujie' for update;
+-------- +--------+----------+
| userID | name   | passWord |
+--------+-------- +----------+
|      1 | liujie | 123456   |
+-------- +--------+----------+
1 row in set
mysql> set autocommit=0;
Query OK, 0 rows affected
mysql> select * from developerinfo where name = 'tong' for update;

等待

mysql> commit;
Query OK, 0 rows affected
mysql> select * from developerinfo where name = 'liujie' for update;
+--------+--------+----------+
| userID | name   | passWord |
+--------+--------+----------+
|      1 | liujie | 123456   |
+--------+--------+----------+
1 row in set
Fenêtre de ligne de commande 1Fenêtre de ligne de commande 2mysql> set autocommit=0;Requête OK, 0 lignes affectéesmysql> sélectionnez * dans Developerinfo où name = 'liujie' pour la mise à jour ;+-------- +--------+----------+| nom d'utilisateur | mot de passe |+--------+------ -- +----------+| 1 | liujie | 123456 |+-------- +--------+----------+1 ligne dans l'ensemblemysql> set autocommit=0;
Requête OK, 0 ligne affectée
mysql> sélectionnez * dans les informations du développeur où nom = 'tong' pour la mise à jour ;attendremysql> Requête OK, 0 ligne affectée mysql> sélectionnez * dans Developerinfo où nom = 'liujie' pour mise à jour;+--------+--------+---------+| nom d'utilisateur | mot de passe |+- -------+--------+----------+| 1 | +--------+----------+1 ligne dans l'ensemble

(3) Interrogez les champs d'index non uniques pour interroger la base de données et utilisez des verrous de ligne pour verrouiller plusieurs lignes

Le verrou de ligne de Mysql est un faux verrou pour l'index, pas pour l'enregistrement, donc différents enregistrements peuvent être verrouillé Scénario

Ouvrir trois fenêtres de ligne de commande pour tester

tr>
Fenêtre de ligne de commande 1 Fenêtre de ligne de commande 2 Fenêtre de ligne de commande 3
mysql> set autocommit =0;
命令行窗口1 命令行窗口2 命令行窗口3
mysql> set autocommit=0;
Query OK, 0 rows affected
mysql> select * from developerinfo where password = '123456
' for update;
+--------+--------+----------+
| userID | name   | passWord |
+-------- +--------+----------+
|      1 | liujie | 123456   |
|      3 | tong   | 123456   |
+--------+--------+---------- +
2 rows in set
mysql> set autocommit =0 ;
Query OK, 0 rows affected

mysql> select * from developerinfo where userid = '1' for update;

等待

mysql> set autocommit = 0;
Query OK, 0 rows affected
mysql> select * from developerinfo where userid = '2
' for update;
+--------+--------+----------+
| userID | name   | passWord |
+--------+--------+----------+
|      2 | yitong | 123      |
+--------+--------+----------+
1 row in set
commit; mysql> select * from developerinfo where userid = '1' for update;
+--------+--------+----------+
| userID | name   | passWord |
+--------+--------+----------+
|      1 | liujie | 123456   |
+--------+--------+----------+
1 row in set

Requête OK, 0 lignes affectées

mysql> sélectionnez * dans Developerinfo où mot de passe = '123456
' pour la mise à jour ;

+--------+--------+----------+
| nom d'utilisateur | mot de passe |

+-------- +--------+----------+| 1 | 3 | pince | 123456 |+--------+--------+---------- +2 lignes dans set

mysql> set autocommit =0 ;Requête OK, 0 ligne affectéemysql> '1' pour la mise à jour ;attendre mysql> set autocommit = 0;Requête OK, 0 lignes affectémysql> sélectionnez * dans Developerinfo où userid = '2' pour mise à jour;+--------+--------+---------+| nom d'utilisateur | mot de passe |+- -------+--------+----------+| 2 | |+--------+--------+----------+1 ligne dans l'ensemble
commit; mysql> sélectionnez * dans Developerinfo où userid = '1' pour mise à jour;+--------+--------+----------------+| nom d'utilisateur | |+- -------+--------+---------+| 1 | ------ +--------+----------+1 ligne dans l'ensemble
(4) Lors de l'utilisation d'un index dans une condition pour exploiter et récupérer la base de données, l'utilisation ou non d'un index nécessite que mysql détermine différents plans d'exécution. Décidez si vous devez utiliser l'index. Si vous devez décider comment utiliser l'explication pour juger l'index, veuillez écouter la décomposition du chapitre suivant Plus de recommandations d'apprentissage gratuites connexes : Tutoriel mysql(vidéo)

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