Вашето решение с флага изглежда осъществимо и мисля, че единственото нещо, което е необходимо, е заключването да изтече. По принцип начинът, по който бих проектирал ключалката, е, че ще напиша клеймо за време, когато заключването е взето, и ще го направя така, че процесът да трябва да актуализира ключалката толкова често (т.е. на всеки 30 секунди), докато все още работи върху записа. Ако процесът умре или по друг начин не успее да завърши работата, заключването ще изтече и други процеси могат да отключат ако изтече повече от два пъти периода на изчакване.
Когато даден процес приключи работата по запис, той ще изчисти флага за заключване и ще маркира записа като обработен (отново друг флаг).
Вероятно ще искате да имате две полета:едно, което да съхранява флага за заключване на времевия печат и друго, което да показва кой процес притежава заключването (в случай, че ви е грижа за това). Предполагам, че има някакъв вид ключ, който може да се използва за подреждане на записите в таблицата, така че понятието "следващо действие" да има смисъл.
Можете да използвате заявка като тази, за да получите следващия запис за обработка:
-- 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
Примерен Fiddle тук:http://sqlfiddle.com/#!11/9c120/26 /1