Twoje rozwiązanie z flagą wydaje się wykonalne i myślę, że jedyne, co jest potrzebne, to wygaśnięcie blokady. Zasadniczo sposób, w jaki zaprojektowałem zamek, to napisanie znacznika czasu, kiedy blokada została zabrana, i sprawię, że proces będzie musiał aktualizować blokada co jakiś czas (tj. co 30 sekund), podczas gdy nadal działa na nagraniu. Jeśli proces umrze lub w inny sposób nie zakończy pracy, blokada wygaśnie, a inne procesy mogą odblokować jeśli upłynie więcej niż dwukrotność limitu czasu.
Kiedy proces zakończy pracę nad rekordem, wyczyści flagę blokady i oznaczy rekord jako przetworzony (ponownie inną flagę).
Prawdopodobnie będziesz chciał mieć dwa pola:jedno, które przechowuje flagę blokady sygnatury czasowej, a drugie, które wskazuje, który proces jest właścicielem blokady (jeśli Ci na tym zależy). Zakładam, że istnieje pewien rodzaj klucza, którego można użyć do uporządkowania rekordów w tabeli, tak aby pojęcie „następnego działania” miało sens.
Możesz użyć takiego zapytania, aby uzyskać następny rekord do przetworzenia:
-- 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
Przykładowe skrzypce tutaj:http://sqlfiddle.com/#!11/9c120/26 /1