Din lösning med flaggan verkar genomförbar och jag tror att det enda som behövs är att få låset att förfalla. I grund och botten skulle jag utforma låset på att jag skulle skriva en tidsstämpel när låset togs och göra det så att processen måste uppdateras låset då och då (dvs var 30:e sekund) medan det fortfarande jobbar på skivan. Om processen dör eller på annat sätt misslyckas med att slutföra arbetet kommer låset att upphöra och andra processer kan låsa upp det om mer än dubbla timeoutperioden går.
När en process avslutar arbetet med en post skulle den rensa låsflaggan och markera posten som bearbetad (igen en annan flagga).
Du kommer förmodligen att vilja ha två fält:ett som skulle lagra tidsstämpellåsflaggan och ett annat som skulle indikera vilken process som äger låset (ifall du bryr dig om det). Jag antar att det finns någon slags nyckel som kan användas för att ordna posterna i tabellen så att begreppet "nästa åtgärd" är meningsfullt.
Du kan använda en fråga som denna för att få nästa post att bearbeta:
-- 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
Exempel på fiol här:http://sqlfiddle.com/#!11/9c120/26 /1