48 votes

Est-ce qu'incrémenter un champ dans MySQL est atomique?

Je suis en train de créer un site web où j'aimerais incrémenter un compteur dans une table MyISAM standard.

Exemple simplifié :

UPDATE votes SET num = num + 1;

Cela va-t-il poser des problèmes si plusieurs connexions effectuent la même requête, ou MySQL prendra-t-il soin de verrouiller la table ou autre pour s'assurer qu'il n'y a pas de conflits ?

1voto

Comme l'a dit un autre utilisateur, cette forme de UPDATE est atomique, mais si vous avez besoin de quelque chose de plus sophistiqué et fiable, utilisez des TRANSACTION comme ceci :

START TRANSACTION;
SELECT @A:=num FROM table1 WHERE x = 1;
UPDATE table1 SET num=@A WHERE x = 1;
COMMIT;

0voto

guykaplan Points 9

Une autre approche lors de l'utilisation d'InnoDB est d'utiliser un index unique sur plusieurs colonnes comme suit :

Table 'Sessions' { clé_unique(browser_session_id, profile_id) // garantit l'insertion d'une seule entrée par session }

sélectionner count(browser_session_id) from Sessions

Garantira le résultat de sessions uniques, car plusieurs sessions par utilisateur ne sont pas autorisées.

Conclusions

  • Avantage

    Chaque insertion nécessite une pré-sélection.

  • Inconvénient

    Il n'est pas adapté à tous les cas.

    Peut ralentir les performances d'écriture et nécessite une gestion supplémentaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X