Перейти к основному содержимому

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.

Смотрите также

NOTIFY, UNLISTEN, max_notify_queue_pages