Dans une base de données MySQL, une condition de concurrence peut se produire lorsque plusieurs connexions tentent de mettre à jour simultanément le même champ, ce qui peut conduire à des résultats incohérents. Par exemple, si deux connexions incrémentent simultanément un compteur « essais », le résultat peut être uniquement « essais 1 » au lieu de « essais 2 ».
Pour éviter de telles conditions situations, plusieurs approches peuvent être employées :
Mise à jour atomique :
Utilisation d'un atome L'instruction update garantit que l'opération d'incrémentation est exécutée de manière atomique, évitant ainsi toute situation de concurrence critique. Par exemple :
UPDATE table SET tries = tries + 1 WHERE condition = value;
Verrouillage de ligne :
Une autre approche consiste à utiliser le verrouillage de ligne avec les tables InnoDB. Cela garantit que toute autre requête tentant d'accéder à la ligne lors d'une mise à jour est obligée d'attendre la fin de la mise à jour. La requête ressemblerait à :
SELECT tries FROM table WHERE condition = value FOR UPDATE; -- Application logic to add to tries UPDATE table SET tries = newvalue WHERE condition = value;
Schéma de version :
Un schéma de version introduit une colonne de version dans la table. Les mises à jour sont ensuite conditionnées à la valeur de l'ancienne version, évitant ainsi toute situation de concurrence critique en garantissant que la mise à jour n'est appliquée que si la version n'a pas changé depuis sa lecture initiale. La requête ressemblerait à :
SELECT tries, version FROM table WHERE condition = value; -- Application logic and old version storage UPDATE table SET tries = newvalue, version = version + 1 WHERE condition = value AND version = oldversion;
Si la mise à jour échoue, cela indique que la table a été mise à jour depuis la lecture initiale, nécessitant un redémarrage du processus.
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!