LISTEN
Эта страница переведена при помощи нейросети GigaChat.
LISTEN
- получение уведомления.
Синтаксис
LISTEN channel
Описание
LISTEN
регистрирует текущую сессию как подписчика на канал уведомлений с именем channel
. Если текущая сессия уже подписана на данный канал, никаких дополнительных действий не выполняется.
Каждый раз, когда вызывается команда NOTIFY channel
— как из этой сессии, так и из любой другой, подключенной к той же базе данных, — все сессии, подписанные на этот канал уведомлений, получают уведомление. Каждая из них в свою очередь уведомляет свое клиентское приложение.
Сессию можно отписать от канала уведомлений с помощью команды UNLISTEN
. Все подписки сессии автоматически удаляются при завершении этой сессии.
Метод, который клиентское приложение должно использовать для обнаружения уведомлений, зависит от используемого интерфейса программирования PostgreSQL. С библиотекой libpq приложение выполняет LISTEN
как обычную SQL-команду, а затем периодически вызывает функцию PQnotifies
, чтобы проверить, были ли получены уведомления. Другие интерфейсы, такие как libpgtcl, предоставляют более высокоуровневые методы обработки уведомлений. При использовании libpgtcl разработчику не нужно напрямую вызывать LISTEN
или UNLISTEN
. Обратитесь к документации по используемому интерфейсу для получения подробностей.
Параметры
channel
- Имя канала уведомления (любой допустимый идентификатор).
Примечания
LISTEN
вступает в силу при фиксации транзакции. Если команды LISTEN
или UNLISTEN
выполняются внутри транзакции, которая затем откатывается, то подписки на каналы остаются без изменений.
Транзакция, в которой выполнена команда LISTEN
, не может быть подготовлена для двухфазной фиксации.
При первичной настройке подписки существует состояние гонки: если в это же время другие транзакции выполняют NOTIFY
и фиксируются, какие именно уведомления получит новая подписка? Ответ: сессия получит все уведомления, зафиксированные после определенного момента в процессе фиксации транзакции. Но этот момент немного позже любого состояния базы данных, которое могла бы наблюдать транзакция в своих запросах. Это приводит к следующему правилу использования LISTEN
:
сначала выполните (и зафиксируйте) команду LISTEN
, затем в новой транзакции проанализируйте состояние базы данных в соответствии с логикой приложения, и только после этого полагайтесь на уведомления для отслеживания последующих изменений. Первые несколько полученных уведомлений могут относиться к изменениям, уже обнаруженным при начальном анализе базы данных — но это, как правило, безвредно.
Более подробное обсуждение использования LISTEN
и NOTIFY
содержится в документации к команде NOTIFY.
Примеры
Демонстрация процедуры ожидания/получения уведомления в psql:
LISTEN virtual;
NOTIFY virtual;
Asynchronous notification "virtual" received from server process with PID 8448.
Совместимость
В стандарте SQL нет команды LISTEN
.