Mysql
 sql >> Base de données >  >> RDS >> Mysql

Consommateur producteur MySQL avec plusieurs threads sélectionnés

J'ai une solution pratique pour vous, celle que j'ai vue mise en œuvre dans un projet sur mon lieu de travail. Au lieu d'utiliser uniquement 0 et 1 pour incomplet et terminé, développez votre ensemble pour inclure plus de cas.

Appelons cette colonne statut . Voici les différentes valeurs de cette colonne et les états correspondants de la tâche.

  1. Lorsque l'état est 0, la tâche n'a été récupérée par aucun thread de travail.
  2. Lorsque l'état est 1, la tâche a été récupérée par un thread de travail et est en cours de traitement.
  3. Lorsque l'état est 2, la tâche a échoué. (Vous devez envisager la possibilité d'un échec du traitement.)
  4. Lorsque l'état est 3, la tâche est terminée.

Vos threads doivent contenir une logique telle qu'ils ne récupèrent que les travaux dont le statut est 0 et modifient le statut en 1. Cela empêchera les autres threads de récupérer les travaux en cours de traitement. Lorsque le travail est terminé, le statut est défini sur 3 et si le travail échoue, le statut est défini sur 2. Ensuite, le fil peut continuer et rechercher un autre travail qui doit encore être terminé.

Vous pouvez également demander aux threads d'envisager de récupérer des travaux de statut 2, mais vous devrez définir une logique pour spécifier un nombre fini de tentatives.

MODIF :

Après une longue discussion , nous avons trouvé la solution ensemble. Ma réponse ci-dessus est bonne dans un état plus général lorsque le «travail» est un processus qui prend un certain temps. Mais ce n'était pas le cas dans le problème du PO.

Donc, la solution qui a finalement fonctionné était celle-ci :

BEGIN 
SELECT * FROM Jobs WHERE JobID = (SELECT * FROM Jobs WHERE completed = 0 LIMIT 1) LOCK IN SHARE MODE;
UPDATE Jobs SET completed = 1 WHERE JobID = (PREVIOUS ID); 
COMMIT;