Для чего используется модификатор SKIP LOCKED в SQL?

«Для чего используется модификатор SKIP LOCKED в SQL?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

SKIP LOCKED — это модификатор для команд блокировки (например, SELECT ... FOR UPDATE), который указывает СУБД пропускать уже заблокированные другими транзакциями строки, возвращая только доступные для блокировки. Это решает проблему блокировок в высококонкурентных сценариях, таких как очереди задач.

Проблема, которую он решает: Без SKIP LOCKED несколько параллельных воркеров, пытающихся выбрать следующую задачу через SELECT ... FOR UPDATE, будут ждать друг друга, создавая очередь из самих себя. SKIP LOCKED позволяет каждому воркеру мгновенно получить свою уникальную задачу.

Пример (PostgreSQL): Реализация очереди задач

-- Воркер 1, 2, 3... параллельно выполняют этот запрос
BEGIN;

-- Выбирает и блокирует до 1 незаблокированной "ожидающей" задачи
SELECT * FROM job_queue
WHERE status = 'PENDING'
ORDER BY created_at ASC
FOR UPDATE SKIP LOCKED
LIMIT 1;

-- Воркер обрабатывает задачу...
UPDATE job_queue SET status = 'PROCESSING' WHERE id = ?;

COMMIT;

Если задача с id=10 заблокирована Воркером 1, Воркер 2 просто пропустит ее и заблокирует задачу id=11.

Ключевые моменты:

  • Поддержка: Нативно есть в PostgreSQL, Oracle, MySQL 8.0+ и SQL Server 2005+ (как READPAST).
  • Использование с NOWAIT: Часто используется вместе с NOWAIT (не ждать) или вместо него, чтобы сразу получить результат, а не таймаут.
  • Применение: Идеален для построения конкурентных очередей, распределенных джобов, систем обработки событий, где несколько потребителей работают с одной таблицей-очередью.