Pull to refresh

Comments 16

для хеширования текста есть встроенная функция hashtext, только почему-то не в документации

круто, не знал. Правда, недокументированные функции страшновато использовать

Что, если взять все эти функции и сделать из них расширение

В итоге можно залочиться на вполне конкретное имя файла, заданное в виде строки

Если уж у нас и так есть база, то обычно проще заложиться на имя какой-то таблицы, а не файла (пример отсюда):

SELECT pg_try_advisory_lock(
  'processed_table'::regclass::oid
, -1 -- ключ типа worker'а
);

Это как? вот у меня есть 100500 файлов. Таблиц может вообще нет. Как мне закладываться на имя таблицы?

Обычно подобную обработку на advlock с монопольным захватом ресурса делают на PG, когда им является уже существующая таблица/запись. Ну и таблицу-то найти можно всегда - хотя бы и системную pg_class.

А вот зачем использовать блокировки на БД для обработки каких-то файлов, если "таблиц вообще нет" - вопрос.

Обычно подобную обработку на advlock с монопольным захватом ресурса делают на PG, когда им является уже существующая таблица/запись.

Не обязательно. Можно исполььзовать advlock для монопольного доступа вообще к любому ресурсу, в том числе находящемуся вне базы.
Главное, чтобы этому ресурсу можно было сопоставить некое уникальное название/идентификатор, которое и используется для взятия лока.

Конечно, можно, но - зачем? То есть СУБД это явно не наилучший механизм для абстрактной синхронизации каких-то процессов. И если это ее единственное применение на проекте, то это странно.

Если постгрес только для локов использовать — то действительно странно.
Но если постгресс уже всё равно есть для данных, то почему бы и локи не сделать через него? Понятно, что в этом случае какие-то таблицы всё-таки будут, но они могут никак не соотноситься с локами.

Ну, я про это и написал - что если у нас уже есть данные в какой-то таблице, и мы для разруливания их обработки используем advlock, то проще закладываться на имя этой таблицы в качестве одного из пары ID рекомендательной блокировки.

Ну или пару (tableoid::oid, PK::integer), если нам нужна блокировка не на всю таблицу, а до конкретной записи - например, при конкурентной обработке очередей.

В качестве альтернативы стоит упомянуть Zookeeper, который и был рожден для управления распределенной конкурентностью.

PgBouncer может работать в двух режимах: сессионный и транзакционный.

В 3 режимах - есть ещё statement.

Сразу скажу, что под сессией здесь мы понимаем tcp-соединение к PostgreSQL, не к pgBouncer, это важно. Чуть ниже расскажу об этом подробнее.

как advisory locks работают, когда скажем есть несколько инстансов postgresql?

никак, их используют на одном инстансе

Sign up to leave a comment.