Идея “если нельзя ослабить изоляцию — используем mutex на стороне БД через pg_advisory_lock” обычно возникает, когда:

  • Нужна строгая сериализация какого-то критического участка (например, “создать ресурс с уникальным бизнес-ключом”, “списать квоту”, “зарегистрировать usage”),
  • но делать весь поток в SERIALIZABLE (или городить тяжелые блокировки строк/таблиц) слишком дорого/сложно,
  • и при этом хочется явно управлять конкурентным доступом к логическому ресурсу, который не всегда удобно “прибить” к одной конкретной строке.

pg_advisory_lock — это “советнический” (advisory) замок: Postgres не навязывает его автоматически. Он работает только там, где ваше приложение договорилось его брать и отпускать.

postgresql