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

Advisory-блокировки в PostgreSQL

Вопрос

Нужно, чтобы ночной пересчёт отчёта запускался не больше чем в одном экземпляре, а приложение работает в 4 подах. Что даёт pg_try_advisory_lock(42)?

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

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

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

Коротко

Правильный ответ: Сессионную блокировку на число 42: второй под получит false. Advisory-блокировки это блокировки на произвольные числа, смысл которых задаёт приложение; база их никак не связывает с таблицами.

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

  1. Блокирует таблицу с oid 42 от записи до конца транзакции
  2. Ставит именованную блокировку только в памяти текущего пода
  3. Сессионную блокировку на число 42: второй под получит falseправильный ответ
  4. Ставит блокировку, которая сама снимается через 42 секунды

Разбор

Advisory-блокировки это блокировки на произвольные числа, смысл которых задаёт приложение; база их никак не связывает с таблицами. Вариант try не ждёт, а сразу возвращает true или false, поэтому второй под пропустит запуск. Сессионная блокировка живёт до явного pg_advisory_unlock или до конца сессии (разрыва соединения), транзакционная (pg_advisory_xact_lock) до конца транзакции. Таймаута у них нет. Подвох: с PgBouncer в режиме transaction pooling сессионные блокировки ведут себя непредсказуемо, потому что сессия базы не принадлежит одному клиенту; там используют транзакционный вариант.

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

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

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