Uw oplossing met de vlag lijkt haalbaar en ik denk dat het enige dat nodig is, is om het slot te laten verlopen. De manier waarop ik het slot zou ontwerpen, is dat ik een tijdstempel zou schrijven wanneer het slot werd genomen en het zo zou maken dat het proces zou moeten bijwerken het slot om de zoveel tijd (d.w.z. elke 30 seconden) terwijl het nog steeds aan de plaat werkt. Als het proces sterft of anderszins het werk niet voltooit, vervalt de vergrendeling en kunnen andere processen ontgrendelen het als meer dan het dubbele van de time-outperiode verstrijkt.
Wanneer een proces klaar is met werken aan een record, zou het de vergrendelingsvlag wissen en het record markeren als verwerkt (opnieuw een andere vlag).
U zult waarschijnlijk twee velden willen hebben:een waarin de vergrendelingsvlag van het tijdstempel wordt opgeslagen en een andere die aangeeft welk proces eigenaar is van de vergrendeling (voor het geval u er om geeft). Ik neem aan dat er een soort sleutel is die kan worden gebruikt om de records in de tabel zodanig te ordenen dat het concept van "volgende actie" zinvol is.
U kunt een query als deze gebruiken om het volgende record te verkrijgen dat moet worden verwerkt:
-- find the next available process and "lock" it by updating it's flag
UPDATE actions_tabe
SET LockFlag = @timestamp,
Process = @processname
WHERE Id IN (SELECT Id
FROM actions_table
WHERE LockFlag IS null
AND IsComplete = '0'
AND ScheduledTime < now()
ORDER BY Scheduledtime ASC, Id ASC
LIMIT 1);
-- return the Id and Action of the record that was just marked above
SELECT Id, Action
FROM actions_table
WHERE Process = @processname
Sample Fiddle hier:http://sqlfiddle.com/#!11/9c120/26 /1