Когда вам нужно обрабатывать фоновые задачи (например, отправку писем или обработку платежей) несколькими воркерами, возникает проблема race condition: два воркера могут взять одну и ту же запись из БД.
Вместо сложной блокировки всей таблицы используйте SKIP LOCKED:
-- Каждый воркер выполняет этот запрос:
BEGIN;
SELECT id, payload
FROM task_queue
WHERE status = 'pending'
ORDER BY created_at ASC
LIMIT 1
FOR UPDATE SKIP LOCKED; -- 👈 Вся магия здесь
-- Обновляем статус найденной задачи
UPDATE task_queue
SET status = 'processing'
WHERE id = :found_id;
COMMIT;