Advisory-блокировки в PostgreSQL
Вопрос
Нужно, чтобы ночной пересчёт отчёта запускался не больше чем в одном экземпляре, а приложение работает в 4 подах. Что даёт pg_try_advisory_lock(42)?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Блокирует таблицу с oid 42 от записи до конца транзакции
- Ставит именованную блокировку только в памяти текущего пода
- Сессионную блокировку на число 42: второй под получит
falseправильный ответ - Ставит блокировку, которая сама снимается через 42 секунды
Разбор
Advisory-блокировки это блокировки на произвольные числа, смысл которых задаёт приложение; база их никак не связывает с таблицами. Вариант try не ждёт, а сразу возвращает true или false, поэтому второй под пропустит запуск. Сессионная блокировка живёт до явного pg_advisory_unlock или до конца сессии (разрыва соединения), транзакционная (pg_advisory_xact_lock) до конца транзакции. Таймаута у них нет. Подвох: с PgBouncer в режиме transaction pooling сессионные блокировки ведут себя непредсказуемо, потому что сессия базы не принадлежит одному клиенту; там используют транзакционный вариант.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Транзакции и изоляция»
- Взаимоблокировки: как ловить и предотвращать
- Долгая транзакция и раздувание таблиц
- MVCC и VACUUM в PostgreSQL
- VACUUM или VACUUM FULL на проде
- Зачем нужна заморозка и что такое wraparound
- Что делает PostgreSQL при deadlock
- Уровень изоляции по умолчанию в PostgreSQL
- Как обеспечивается Durability