Выбор ответа Senior Транзакции и изоляция обновлено

Очередь задач на таблице

Вопрос

Несколько воркеров берут задачи из таблицы jobs. Что позволит им не брать одну и ту же задачу и не ждать друг друга?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: SELECT ... WHERE status = 'new' LIMIT 10 FOR UPDATE SKIP LOCKED. FOR UPDATE блокирует выбранные строки, а SKIP LOCKED пропускает те, что уже заблокированы другими воркерами, поэтому каждый получает свои задачи без ожидания.

Варианты ответа

  1. SELECT ... WHERE status = 'new' LIMIT 10 на уровне Serializable
  2. SELECT ... WHERE status = 'new' LIMIT 10 FOR UPDATE NOWAIT
  3. SELECT DISTINCT ... WHERE status = 'new' LIMIT 10 FOR SHARE
  4. SELECT ... WHERE status = 'new' LIMIT 10 FOR UPDATE SKIP LOCKEDправильный ответ

Разбор

FOR UPDATE блокирует выбранные строки, а SKIP LOCKED пропускает те, что уже заблокированы другими воркерами, поэтому каждый получает свои задачи без ожидания. NOWAIT не пропускает, а сразу выдаёт ошибку при занятой строке. Serializable без блокировок даст конфликты и откаты, DISTINCT к конкуренции отношения не имеет, а FOR SHARE позволит нескольким воркерам взять одну и ту же строку.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме