La tua soluzione con il flag sembra fattibile e penso che l'unica cosa necessaria sia far scadere il blocco. Fondamentalmente il modo in cui architetterei il blocco è scrivere un timestamp quando il blocco è stato preso e farlo in modo che il processo debba aggiornare il blocco ogni tanto (cioè ogni 30 secondi) mentre sta ancora lavorando sul record. Se il processo si interrompe o altrimenti non riesce a completare il lavoro, il blocco scadrà e altri processi possono sbloccare se è trascorso più del doppio del periodo di timeout.
Quando un processo finisce di lavorare su un record, cancella il flag di blocco e contrassegna il record come elaborato (di nuovo un altro flag).
Probabilmente vorrai avere due campi:uno che memorizzerebbe il flag di blocco timestamp e un altro che indicherebbe quale processo possiede il blocco (nel caso ti interessi). Presumo che esista una sorta di chiave che può essere utilizzata per ordinare i record nella tabella in modo tale che il concetto di "azione successiva" sia significativo.
Puoi utilizzare una query come questa per ottenere il record successivo da elaborare:
-- 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
Esempio di Fiddle qui:http://sqlfiddle.com/#!11/9c120/26 /1