sql >> Database teknologi >  >> RDS >> Mysql

MySQL-producerende forbruger med flere udvalgte tråde

Jeg har en praktisk løsning til dig, en som jeg har set implementeret i et projekt på min arbejdsplads. I stedet for kun at bruge 0 og 1 for ufuldstændige og afsluttede, kan du udvide dit sæt til at omfatte flere sager.

Lad os kalde den kolonne for status . Her er de forskellige værdier for den kolonne og de tilsvarende tilstande for jobbet.

  1. Når status er 0, er jobbet ikke blevet hentet af nogen arbejdertråd.
  2. Når status er 1, er jobbet blevet samlet op af en arbejdstråd og er under behandling.
  3. Når status er 2, er jobbet mislykket. (Du bør overveje muligheden for fejl i behandlingen.)
  4. Når status er 3, er opgaven fuldført.

Dine tråde bør indeholde logik, så den kun opfanger job, for hvem status er 0, og ændrer status til 1. Dette vil forhindre andre tråde i at opfange de job, som er under behandling. Når jobbet er færdigt, sættes status til 3, og hvis opgaven mislykkes, sættes status til 2. Så kan tråden gå videre og lede efter et andet job, der stadig skal færdiggøres.

Du kan også bede trådene om at overveje at hente jobs med status 2, men du bliver nødt til at definere logik for at angive et begrænset antal genforsøg.

EDIT:

Efter en lang diskussion , faldt vi over løsningen sammen. Mit svar ovenfor er godt i en mere generaliseret tilstand, når 'jobbet' er en proces, der tager noget tid at fuldføre. Men det var ikke tilfældet i OP's problem.

Så løsningen, der til sidst virkede, var denne:

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;



  1. Håndtering af frødata i R12.2 online patching

  2. Befolkning af flere borde i sails vandlinje orm

  3. Django idiosynkrasier

  4. doktrin2 og gruppe_konkat