Выбор ответа Senior Транзакции и изоляция обновлено
Очередь задач на таблице
Вопрос
Несколько воркеров берут задачи из таблицы jobs. Что позволит им не брать одну и ту же задачу и не ждать друг друга?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: SELECT ... WHERE status = 'new' LIMIT 10 FOR UPDATE SKIP LOCKED. FOR UPDATE блокирует выбранные строки, а SKIP LOCKED пропускает те, что уже заблокированы другими воркерами, поэтому каждый получает свои задачи без ожидания.
Варианты ответа
SELECT ... WHERE status = 'new' LIMIT 10на уровне SerializableSELECT ... WHERE status = 'new' LIMIT 10 FOR UPDATE NOWAITSELECT DISTINCT ... WHERE status = 'new' LIMIT 10 FOR SHARESELECT ... WHERE status = 'new' LIMIT 10 FOR UPDATE SKIP LOCKEDправильный ответ
Разбор
FOR UPDATE блокирует выбранные строки, а SKIP LOCKED пропускает те, что уже заблокированы другими воркерами, поэтому каждый получает свои задачи без ожидания. NOWAIT не пропускает, а сразу выдаёт ошибку при занятой строке. Serializable без блокировок даст конфликты и откаты, DISTINCT к конкуренции отношения не имеет, а FOR SHARE позволит нескольким воркерам взять одну и ту же строку.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Транзакции и изоляция»
- Advisory-блокировки в PostgreSQL
- Как избежать deadlock при переводах
- Взаимоблокировки: как ловить и предотвращать
- Долгая транзакция и раздувание таблиц
- MVCC и VACUUM в PostgreSQL
- VACUUM или VACUUM FULL на проде
- Зачем нужна заморозка и что такое wraparound
- Что делает PostgreSQL при deadlock