Вступить в клуб →
средняявопросPostgreSQL, ORM и оптимизация запросов

Два воркера взяли из таблицы одну и ту же задачу и отправили письмо дважды

Очередь задач хранится в таблице. Каждый из воркеров делает:

SELECT id FROM jobs WHERE status = 'new' ORDER BY id LIMIT 1;
-- приложение получает id = 42
UPDATE jobs SET status = 'processing' WHERE id = 42;

Иногда два воркера получают одну и ту же задачу. Какой вариант надёжно это исключит, не выстраивая воркеры в очередь друг за другом?

  • SELECT … FOR UPDATE SKIP LOCKED в транзакции с последующим UPDATE
  • Выполнять SELECT и UPDATE в транзакции с уровнем READ COMMITTED
  • SELECT … FOR UPDATE без SKIP LOCKED
  • Добавить уникальный индекс на колонку status

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела