Comment utiliser les verrous distribués pour contrôler les accès simultanés dans MySQL ?
Dans les systèmes de bases de données, un accès simultané élevé est un problème courant et les verrous distribués sont l'une des solutions couramment utilisées. Cet article explique comment utiliser les verrous distribués dans MySQL pour contrôler les accès simultanés et fournit des exemples de code correspondants.
1.Principe
Les verrous distribués peuvent être utilisés pour protéger les ressources partagées afin de garantir qu'un seul thread peut accéder à la ressource en même temps. Dans MySQL, les verrous distribués peuvent être implémentés des manières suivantes :
2. Étapes de mise en œuvre
Voici les étapes pour utiliser les verrous distribués dans MySQL :
Étape 1 : Créer lock_table
Tout d'abord, créez une table nommée lock_table pour stocker l'état du verrou. La table est définie comme suit :
CREATE TABLE lock_table
(lock_table
(
id
INT NOT NULL AUTO_INCREMENT,
lock_name
VARCHAR(64) NOT NULL,
lock_holder
VARCHAR(64) DEFAULT NULL,
status
INT DEFAULT '0',
created_time
TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id
),
UNIQUE KEY lock_name
(lock_name
id
INT NOT NULL AUTO_INCREMENT,
lock_name
VARCHAR(64) NOT NULL,
lock_holder
VARCHAR(64) DEFAULT NULL, status
INT DEFAULT '0',
created_time
TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
id
), UNIQUE KEY lock_name
(lock_name
)
Le Voici l'exemple de code d'acquisition de verrou distribué :
SELECT * FROM lock_table WHERE lock_name = 'my_lock' FOR UPDATE;
-- Déterminez si d'autres threads détiennent déjà le verrou
SELECT * FROM lock_table WHERE lock_name = 'my_lock' AND status = 1;
-- Si aucun autre thread ne détient le verrou, vous pouvez vous définir comme détenteur du verrou et définir le statut du verrou sur 1
Lorsque le thread termine l'opération de la ressource partagée, le verrou distribué doit être libéré à temps. Voici un exemple de code pour libérer un verrou distribué :
SELECT * FROM lock_table WHERE lock_name = 'my_lock' FOR UPDATE;
-- Détermine si le thread actuel détient le verrou
SELECT * FROM lock_table WHERE lock_name = 'my_lock' AND lock_holder = 'thread_id';
-- Si le thread actuel détient le verrou, définissez le détenteur du verrou et son statut sur null et 0
Éviter les blocages : un blocage fait référence à une situation dans laquelle deux transactions ou plus s'attendent pour libérer les ressources de verrouillage, ce qui entraîne l'impossibilité de continuer. Afin d'éviter l'apparition d'un blocage, vous devez faire attention à l'ordre d'acquisition et de libération du verrou lors de l'utilisation de verrous distribués.
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!