Иногда нужно, чтобы несколько воркеров одновременно обрабатывали очередь задач, не мешая друг другу. Чтобы избежать гонок и блокировок, используется
SELECT … FOR UPDATE SKIP LOCKED.Представим, что у нас есть таблица задач:
SELECT id, status
FROM tasks
WHERE status = 'pending';
Если несколько процессов попытаются взять одну и ту же задачу — возможна гонка или блокировка.
Используем безопасный способ:
BEGIN;
SELECT id
FROM tasks
WHERE status = 'pending'
FOR UPDATE SKIP LOCKED
LIMIT 1;
-- UPDATE tasks SET status = 'processing' WHERE id = …
COMMIT;
🔥 Каждый воркер получает только одну *свободную* задачу. Если задача уже заблокирована другим процессом — она просто пропускается.
➡️ SQL Ready | #практика