Solusi Anda dengan bendera tampaknya layak dan saya pikir satu-satunya hal yang diperlukan adalah membuat kunci kedaluwarsa. Pada dasarnya cara saya merancang kunci adalah saya akan menulis stempel waktu ketika kunci diambil dan membuatnya sehingga prosesnya harus memperbarui kunci sesering mungkin (yaitu setiap 30 detik) saat masih bekerja pada rekaman. Jika proses mati atau gagal menyelesaikan pekerjaan, kunci akan kedaluwarsa dan proses lain dapat membuka itu jika lebih dari dua kali lipat periode batas waktu berlalu.
Ketika sebuah proses selesai mengerjakan sebuah record, proses tersebut akan menghapus lock flag dan menandai record sebagai diproses (lagi-lagi flag lain).
Anda mungkin ingin memiliki dua bidang:satu yang akan menyimpan tanda kunci cap waktu dan yang lain yang akan menunjukkan proses mana yang memiliki kunci (jika Anda peduli). Saya berasumsi bahwa ada semacam kunci yang dapat digunakan untuk mengurutkan catatan dalam tabel sehingga konsep "tindakan selanjutnya" bermakna.
Anda dapat menggunakan kueri seperti ini untuk mendapatkan catatan selanjutnya untuk diproses:
-- 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
Contoh Fiddle di sini:http://sqlfiddle.com/#!11/9c120/26 /1