Parmi les verrous au niveau des lignes, les verrous au niveau des tables et les verrous au niveau des pages dans MySQL, nous avons introduit que les verrous au niveau des lignes sont les verrous les plus granulaires dans MySQL. réduire les conflits dans les opérations de base de données. Les verrous au niveau des lignes sont divisés en verrous partagés et verrous exclusifs. Cet article présentera en détail les concepts, l'utilisation et les précautions des verrous partagés et des verrous exclusifs.
Le verrou partagé, également connu sous le nom de verrou de lecture, est un verrou créé par une opération de lecture. D'autres utilisateurs peuvent lire les données simultanément, mais aucune transaction ne peut modifier les données (acquérir un verrou exclusif sur les données) tant que tous les verrous partagés n'ont pas été libérés.
Si la transaction T
ajoute un verrou partagé aux données A
, les autres transactions ne peuvent ajouter que des verrous partagés à A
et ne peuvent pas ajouter de verrous exclusifs. Les transactions bénéficiant de verrous partagés peuvent uniquement lire des données et ne peuvent pas les modifier.
Utilisation
SELECT ... LOCK IN SHARE MODE;
Ajouter LOCK IN SHARE MODE
après l'instruction de requête, MySQL ajoutera le partage à chaque ligne du résultat de la requête Lock, lorsqu'aucun autre thread n'utilise un verrou exclusif sur une ligne du jeu de résultats de la requête, il peut demander avec succès un verrou partagé, sinon il sera bloqué. D'autres threads peuvent également lire des tables à l'aide de verrous partagés, et ces threads lisent la même version des données.
Le verrouillage exclusif est également appelé verrouillage en écriture et verrouillage exclusif Si la transaction T
ajoute un verrouillage exclusif aux données A
, les autres transactions ne peuvent plus y accéder A
. Ajoutez n’importe quel type de blocus. Les transactions bénéficiant de verrous exclusifs peuvent à la fois lire et modifier des données.
Utilisation
SELECT ... FOR UPDATE;
Ajouter FOR UPDATE
après l'instruction de requête, MySQL ajoutera un verrou exclusif à chaque ligne du résultat de la requête, lorsqu'aucun autre thread n'utilise un verrou exclusif sur une ligne du jeu de résultats de la requête, il peut demander avec succès un verrou exclusif, sinon il sera bloqué.
Le verrouillage d'intention est un verrou au niveau de la table, qui est principalement conçu pour révéler le type de verrou qui sera demandé pour la ligne suivante dans une transaction. Deux verrous de table dans InnoDB :
Intention Shared Lock (IS) : indique que la transaction se prépare à ajouter un verrou partagé à la ligne de données, ce qui signifie qu'une ligne de données doit être obtenue avant d'ajouter un verrou partagé. IS
verrou de la table ;
intention de verrouillage exclusif (IX) : similaire à ce qui précède, indiquant que la transaction se prépare à ajouter un verrou exclusif à la ligne de données, indiquant que la transaction ajoute un verrou exclusif à une ligne de données avant. Le verrou IX
de la table doit être obtenu en premier.
Les verrous d'intention sont automatiquement ajoutés par InnoDB et ne nécessitent pas l'intervention de l'utilisateur.
Pour INSERT
, UPDATE
et DELETE
, InnoDB ajoutera automatiquement des verrous exclusifs aux données impliquées ; pour les déclarations générales SELECT
, InnoDB n'ajoutera aucun verrou et les transactions pourront être effectuées via les instructions suivantes ajoutent explicitement des verrous partagés ou des verrous exclusifs.
Verrouillage partagé : SELECT ... LOCK IN SHARE MODE;
Verrouillage exclusif : SELECT ... FOR UPDATE;
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!