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.
- Als de status 0 is, is de taak niet opgepikt door een werkthread.
- Als de status 1 is, is de taak opgepikt door een werkthread en wordt deze verwerkt.
- Als de status 2 is, is de taak mislukt. (U moet rekening houden met de mogelijkheid dat de verwerking mislukt.)
- 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;