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.
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 tableCREATE 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;
INSERT INTO `developerinfo` VALUES ('1', 'liujie', '123456'); INSERT INTO `developerinfo` VALUES ('2', 'yitong', '123'); INSERT INTO `developerinfo` VALUES ('3', 'tong', '123456');
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 |
(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
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;
mysql>
sélectionnez * dans Developerinfo où mot de passe = '123456 | nom d'utilisateur | mot de passe | |
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 | tr> |
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!