Maison >base de données >tutoriel mysql >Comment pouvez-vous atténuer les conditions de concurrence lors de l'incrémentation de champs dans les bases de données MySQL ?
Atténuation des conditions de concurrence lors de l'incrémentation de champs dans les bases de données MySQL
Dans un scénario où plusieurs connexions accèdent au même enregistrement de base de données MySQL pour des mises à jour simultanées, un une situation de concurrence critique peut survenir, entraînant des mises à jour involontaires et inexactes. Cela peut se produire lorsque les deux connexions récupèrent la même valeur de champ (par exemple, un compteur), l'incrémentent et mettent à jour l'enregistrement avec leurs valeurs augmentées respectives. Comme les deux connexions fonctionnent indépendamment, la valeur finale mise à jour peut ne refléter qu'un seul incrément au lieu des multiples incréments prévus.
Pour résoudre ce problème, MySQL propose différentes approches :
Mise à jour atomique
Les mises à jour atomiques peuvent être utilisées pour garantir que les incréments de champ se produisent instantanément et de manière atomique. Ceci peut être réalisé grâce à une seule requête qui incrémente le champ, comme indiqué ci-dessous :
update table set tries=tries+1 where condition=value;
Verrouillage de ligne
Le verrouillage de ligne est une autre solution viable. En utilisant cette technique, les connexions peuvent verrouiller les lignes en cours de mise à jour. Cela garantit qu'une seule connexion peut modifier la ligne à la fois, éliminant ainsi la condition de concurrence critique. En conjonction avec le verrouillage des lignes, il est recommandé d'utiliser les tables InnoDB plutôt que les tables MyISAM pour la prise en charge. Un exemple de requête utilisant le verrouillage de ligne ressemblerait à :
select tries from table where condition=value for update; .. do application logic to add to `tries` update table set tries=newvalue where condition=value;
Schéma de version
Une approche largement utilisée consiste à introduire une colonne de version dans la table de base de données. Cette colonne de version suit les modifications apportées à l'enregistrement et aide à détecter les conditions de concurrence. La requête avec cette approche suivrait généralement ce modèle :
select tries,version from table where condition=value; .. do application logic, and remember the old version value. update table set tries=newvalue,version=version + 1 where condition=value and version=oldversion;
Si la mise à jour échoue ou ne renvoie aucune ligne affectée, cela signifie qu'une autre connexion a mis à jour la table simultanément. Dans de tels cas, le processus doit être redémarré, y compris la récupération des valeurs mises à jour, l'exécution de la logique d'application et une nouvelle tentative de mise à jour.
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!