FOR UPDATE SKIP LOCKED — флаг, который позволяет захватить строку, а занятые другими процессами — пропустить, не ожидая их.SELECT id
FROM jobs
WHERE taken_at IS NULL
ORDER BY created_at
FOR UPDATE SKIP LOCKED
LIMIT 1;
Сделаем атомарный захват задачи:
UPDATE jobs
SET taken_at = now()
WHERE id = ( ... тот самый SELECT ... )
RETURNING *;
Если задача взята, она возвращается. Если другой воркер схватил её раньше —
SELECT просто пропустит её.Можно добавить таймаут на незавершённые задачи:
WHERE taken_at IS NULL
OR taken_at < now() - interval '5 minutes'
🔥 Это превращает таблицу в настоящую надёжную очередь.
➡️ SQL Ready | #совет
