Giải pháp của bạn với lá cờ có vẻ khả thi và tôi nghĩ điều duy nhất cần thiết là làm cho khóa hết hạn. Về cơ bản, cách tôi kiến trúc khóa là tôi sẽ viết dấu thời gian khi khóa được thực hiện và tạo nó để quá trình sẽ phải cập nhật khóa thường xuyên (tức là cứ 30 giây một lần) trong khi nó vẫn hoạt động trên hồ sơ. Nếu quy trình bị chết hoặc không thể hoàn thành công việc, khóa sẽ hết hạn và các quy trình khác có thể mở khóa nó nếu hơn gấp đôi khoảng thời gian chờ trôi qua.
Khi một quá trình kết thúc hoạt động trên một bản ghi, nó sẽ xóa cờ khóa và đánh dấu bản ghi là đã xử lý (lại một lá cờ khác).
Bạn có thể sẽ muốn có hai trường:một trường sẽ lưu trữ cờ khóa dấu thời gian và một trường khác cho biết tiến trình nào sở hữu khóa (trong trường hợp bạn quan tâm đến nó). Tôi giả định rằng có một số loại khóa có thể được sử dụng để sắp xếp các bản ghi trong bảng sao cho khái niệm "hành động tiếp theo" là có ý nghĩa.
Bạn có thể sử dụng một truy vấn như thế này để lấy bản ghi tiếp theo để xử lý:
-- 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 mẫu tại đây: http://sqlfiddle.com/#!11/9c120/26 / 1