sql >> Database >  >> RDS >> Mysql

MySQL producer-consument met meerdere geselecteerde threads

Ik heb een praktische oplossing voor je, die ik heb gezien in een project op mijn werkplek. In plaats van alleen 0 en 1 te gebruiken voor onvolledig en voltooid, breid je je set uit met meer cases.

Laten we die kolom status noemen . Hier zijn de verschillende waarden van die kolom en de bijbehorende statussen van de taak.

  1. Als de status 0 is, is de taak niet opgepikt door een werkthread.
  2. Als de status 1 is, is de taak opgepikt door een werkthread en wordt deze verwerkt.
  3. Als de status 2 is, is de taak mislukt. (U moet rekening houden met de mogelijkheid dat de verwerking mislukt.)
  4. Als de status 3 is, is de taak voltooid.

Uw threads moeten logica bevatten zodat het alleen jobs oppikt waarvan de status 0 is en de status verandert in 1. Dit zal andere threads niet toestaan ​​om jobs op te pikken die in behandeling zijn. Wanneer de taak is voltooid, wordt de status ingesteld op 3 en als de taak mislukt, wordt de status ingesteld op 2. Dan kan de thread verder gaan en op zoek gaan naar een andere taak die nog moet worden voltooid.

Je kunt de discussielijnen ook vragen om taken met status 2 op te nemen, maar je zult logica moeten definiëren om een ​​eindig aantal nieuwe pogingen op te geven.

BEWERKEN:

Na een lange discussie , kwamen we samen op de oplossing. Mijn bovenstaande antwoord is goed in een meer algemene toestand wanneer de 'taak' een proces is dat enige tijd in beslag neemt. Maar dat was niet het geval in het probleem van de OP.

Dus de oplossing die uiteindelijk werkte, was deze:

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. Is het mogelijk om de voorwaarde op te geven in Count()?

  2. Een opgeslagen procedure maken:de tekenset en sortering instellen

  3. Hoe de INSERT-bewerking in de MySql-trigger afbreken?

  4. Converteer maandnaam naar maandnummer in PostgreSQL