Maison > base de données > tutoriel mysql > Comment utiliser les verrous de table et de ligne pour le contrôle de concurrence dans MySQL ?

Comment utiliser les verrous de table et de ligne pour le contrôle de concurrence dans MySQL ?

WBOY
Libérer: 2023-07-29 20:39:40
original
1348 Les gens l'ont consulté

Comment utiliser les verrous de table et de ligne pour le contrôle de concurrence dans MySQL ?

Dans une base de données, il arrive souvent que plusieurs utilisateurs opèrent sur les mêmes données en même temps. Dans ce cas, un contrôle de concurrence est nécessaire pour garantir la cohérence des données. MySQL fournit deux mécanismes : les verrous de table et les verrous de ligne pour obtenir un contrôle de concurrence. Cet article se concentrera sur la façon d'utiliser les verrous de table et de ligne pour le contrôle de concurrence dans MySQL, et donnera des exemples de code correspondants.

  1. Verrouillage de table

Le verrouillage de table est le mécanisme de verrouillage le plus basique de MySQL. Il verrouille la table entière. Lorsqu'un utilisateur met à jour une table, un verrou en écriture est automatiquement ajouté à la table. Les opérations de lecture et d'écriture des autres utilisateurs sur la table doivent attendre que le verrou soit libéré. Voici un exemple de code pour utiliser les verrous de table :

-- 锁定表
LOCK TABLES table_name WRITE;

-- 进行写操作
UPDATE table_name SET column_name = value WHERE condition;

-- 解锁表
UNLOCK TABLES;
Copier après la connexion

Dans le code ci-dessus, lorsqu'un utilisateur exécute la commande LOCK TABLES table_name WRITE, un verrou en écriture sera ajouté au table_name<. /code> tableau. Si d'autres utilisateurs doivent accéder à la table <code>table_name lors d'opérations de lecture ou d'écriture, ils doivent attendre que le verrou soit libéré. Une fois l'opération terminée, vous pouvez utiliser la commande UNLOCK TABLES pour libérer le verrou. LOCK TABLES table_name WRITE命令时,会对table_name表加上写锁。其他用户在进行读、写操作时,如果需要访问table_name表,就需要等待锁释放。在完成操作后,可以使用UNLOCK TABLES命令来释放锁。

需要注意的是,在使用表锁的时候,所有需要操作的表都需要加锁,这会导致并发性能下降。

  1. 行锁

相比于表锁,行锁给予并发控制更细粒度的控制。对于被锁定的行,其他用户可以继续对其他行进行读和写操作。下面是使用行锁的示例代码:

-- 设置事务隔离级别
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

-- 开启事务
START TRANSACTION;

-- 对行加锁
SELECT column_name FROM table_name WHERE condition FOR UPDATE;

-- 进行写操作
UPDATE table_name SET column_name = value WHERE condition;

-- 提交事务
COMMIT;
Copier après la connexion

上述代码中,我们首先设置了事务的隔离级别为SERIALIZABLE,这是最高级别的事务隔离级别,可以保证最高程度的数据一致性。然后通过SELECT...FOR UPDATE

Il convient de noter que lors de l'utilisation des verrous de table, toutes les tables qui doivent être exploitées doivent être verrouillées, ce qui entraînera une diminution des performances de concurrence.

    Verrouillage de ligne

    Par rapport aux verrous de table, les verrous de ligne offrent un contrôle plus précis de la concurrence. Pour les lignes verrouillées, les autres utilisateurs peuvent continuer à lire et à écrire sur d'autres lignes. Voici un exemple de code utilisant des verrous de ligne :

    rrreee
      Dans le code ci-dessus, nous définissons d'abord le niveau d'isolation des transactions sur SERIALIZABLE, qui est le niveau d'isolation des transactions le plus élevé et peut garantir le plus haut degré de cohérence des données. Utilisez ensuite l'instruction SELECT...FOR UPDATE pour verrouiller les lignes qui doivent être exploitées. Les autres utilisateurs doivent attendre que le verrou soit libéré lorsqu'ils doivent accéder à la ligne verrouillée.
    1. Il convient de noter que l'utilisation de verrous de ligne peut provoquer un blocage. Par conséquent, la granularité et l’ordre des verrous doivent être soigneusement pris en compte lors de l’utilisation des verrous de ligne afin d’éviter les blocages.
    🎜En résumé, MySQL fournit deux mécanismes de contrôle de concurrence : les verrous de table et les verrous de ligne. Les verrous de table conviennent aux opérations sur la table entière, tandis que les verrous de ligne conviennent aux opérations sur des lignes partielles. Le choix d'un mécanisme de verrouillage approprié en fonction des besoins réels peut améliorer les performances de concurrence et la cohérence des données de la base de données. 🎜🎜Référence : 🎜🎜🎜Documentation officielle MySQL : https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html🎜🎜

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal