フラグを使用した解決策は実行可能であるように思われます。必要なのは、ロックを期限切れにすることだけだと思います。基本的に、ロックを設計する方法は、ロックが取得されたときにタイムスタンプを書き込んで、プロセスが更新する必要があるようにすることです。 レコードの処理中は、頻繁に(つまり、30秒ごとに)ロックします。プロセスが停止するか、その他の方法で作業を完了できない場合、ロックは期限切れになり、他のプロセスはロックを解除できます。 タイムアウト期間が2倍以上経過した場合。
プロセスがレコードの処理を終了すると、ロックフラグがクリアされ、レコードが処理済みとしてマークされます(ここでも別のフラグ)。
おそらく、2つのフィールドが必要になるでしょう。1つはタイムスタンプロックフラグを格納し、もう1つはどのプロセスがロックを所有しているかを示します(気になる場合)。 「次のアクション」の概念が意味を持つように、テーブル内のレコードを並べ替えるために使用できるある種のキーがあると思います。
このようなクエリを使用して、処理する次のレコードを取得できます。
-- 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
ここにサンプルフィドル: http://sqlfiddle.com/#!11/9c120/26 / 1