Большинство знают
SKIP LOCKED только для очередей через SELECT ... FOR UPDATE. Но мало кто использует его для параллельной пакетной обработки внутри PostgreSQL.Если несколько воркеров одновременно обрабатывают огромную таблицу задач:
SELECT id
FROM jobs
WHERE processed = false
FOR UPDATE;
Без
SKIP LOCKED процессы начинают ждать друг друга даже при наличии свободных строк.PostgreSQL позволяет просто пропускать уже занятые записи:
SELECT id
FROM jobs
WHERE processed = false
FOR UPDATE SKIP LOCKED;
Теперь каждый воркер мгновенно получает только свободные строки без ожидания и конфликтов.
Это можно встроить прямо в
UPDATE:WITH cte AS (
SELECT id
FROM jobs
WHERE processed = false
LIMIT 100
FOR UPDATE SKIP LOCKED
)
UPDATE jobs
SET processed = true
WHERE id IN (SELECT id FROM cte);
Получается параллельная обработка на уровне PostgreSQL без внешних систем очередей.
🔥 Аналогично строят высоконагруженные фоновые обработчики, обработку писем, биллинг и массовые пакетные операции.
➡️ SQL Ready | #совет
