Два воркера взяли из таблицы одну и ту же задачу и отправили письмо дважды
Очередь задач хранится в таблице. Каждый из воркеров делает:
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
