J'ai une énorme liste d'URL dans une table MySQL InnoDB, et des processus de travail qui interrogent MySQL pour un ensemble d'URL à traiter. Les URL doivent immédiatement être marquées comme étant traitées, afin que les autres processus de travail ne gaspillent pas de ressources en commençant à traiter les mêmes.Bonne façon d'utiliser MySQL pour assigner des tâches aux processus de travail
Actuellement, je fais d'abord pour obtenir des URL:
SELECT DISTINCT url FROM urls WHERE task_assigned is NULL ORDER BY id LIMIT 100
Puis dans le code I boucle à travers chacun naïvement ces urls à marquer comme étant traitée:
UPDATE urls SET task_assigned = NOW() WHERE url = ? COLLATE utf8_bin
Je suis parfaitement conscient à quel point c'est stupide et inefficace. Plus important encore, il n'y a aucune garantie qu'un autre processus de travail n'essaierait pas d'obtenir une liste au milieu de mes UPDATEs. Quelle est la belle façon de faire ça? Devrais-je en faire une transaction, comment?
Merci. Cependant, pouvez-vous penser à une méthode purement SQL sans avoir à créer la [liste d'URL] séparées par des virgules dans le code? – Bemmu
Eh bien, vous pouvez toujours simplement remplacer ce bit par une sous-requête (copier et coller l'instruction SELECT). Je ne sais pas si ça marcherait ... probablement mieux que la version du code, en fait. – kquinn