Если в таблице есть очередь заданий, которая будет периодически опрашиваться несколькими разными рабочими клиентами ... как лучше всего запретить каждому работнику получать один и тот же элемент для работы?
Произнесите таблицу, такую как: ItemId, LastAttemptDateTime, AttemptCount и различные детали элемента.
Учитывая индекс на LastAttemptDateTime и отсортированный в порядке возрастания, и различные клиенты запрашивают таблицу, чтобы получить элемент для обработки.
Я использую хранимую процедуру в MS SQL, чтобы сделать это ... что-то вроде:
CREATE PROCEDURE GetNextQueueItem AS
SET NOCOUNT ON
DECLARE @ItemId INT
UPDATE myqueue SET @ItemId=ItemId, AttemptCount=AttemptCount+1, LastAttemptDateTime=GetDate()
WHERE ItemId=(SELECT TOP 1 ItemId
FROM myqueue
ORDER BY LastAttemptDateTime ASC)
SELECT ItemId, AttemptCount, and various item detail fields
FROM myqueue
WHERE ItemId = @ItemId
Я довольно новичок в PostgreSQL, и мне было интересно, есть ли альтернативные подходы. (TOP 1 изменится на LIMIT 1.)