PostgreSQL умеет пропускать заблокированные строки без ожидания! — 6 июня 2026 г. в 18:57:50.979
PostgreSQL умеет пропускать заблокированные строки без ожидания! Большинство знают 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 | #совет

