Jag har en praktisk lösning för dig, en som jag har sett implementerad i ett projekt på min arbetsplats. Istället för att bara använda 0 och 1 för ofullständiga och slutförda, utöka din uppsättning till att inkludera fler fall.
Låt oss kalla den kolumnen status . Här är de olika värdena för den kolumnen och motsvarande tillstånd för jobbet.
- När status är 0 har jobbet inte plockats upp av någon arbetstråd.
- När status är 1 har jobbet plockats upp av en arbetstråd och är under bearbetning.
- När status är 2 har jobbet misslyckats. (Du bör överväga risken för misslyckande i behandlingen.)
- När status är 3 har jobbet slutförts.
Dina trådar bör innehålla logik så att den bara plockar upp jobb för vilka statusen är 0 och ändrar status till 1. Detta kommer att förhindra att andra trådar hämtar de jobb som är under bearbetning. När jobbet är klart sätts statusen till 3 och om jobbet misslyckas sätts statusen till 2. Sedan kan tråden gå vidare och leta efter ett annat jobb som fortfarande ska slutföras.
Du kan också be trådarna att överväga att hämta jobb med status 2, men du måste definiera logik för att ange ett ändligt antal försök.
EDIT:
Efter en lång diskussion , snubblade vi över lösningen tillsammans. Mitt svar ovan är bra i ett mer generaliserat tillstånd när "jobbet" är en process som tar lite tid att slutföra. Men det var inte fallet i OP:s problem.
Så lösningen som till slut fungerade var denna:
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;