3 votes

Comment éviter les conditions de course si plusieurs clients sélectionnent dans MySQL ?

J'ai une table task_id qui a deux colonnes :

`tid`:task id,
`state`:0:unfinished,1:processing,2:finished

C'est facile si je n'utilise qu'un seul client (Perl script) : récupérer une unfinished l'identifiant de la tâche, mettez-le à jour en processing le traiter, et le mettre à jour en finished dans une boucle.

Mais j'ai l'intention d'utiliser plusieurs clients pour effectuer cette tâche. Il y a une chance que deux clients récupèrent un enregistrement en même temps, comment l'éviter ?

3voto

neeraj Points 1200

Si le moteur de votre table mysql est INNODB, il verrouille cette ligne particulière lors de la mise à jour de l'enregistrement de la table afin que les autres requêtes ne soient pas en conflit avec la mise à jour précédente.

2voto

ysth Points 54757

Que la mise à jour soit quelque chose comme :

update task_id set state=1 where tid=? and state=0;

puis vérifier si la mise à jour a effectivement modifié un enregistrement.

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