LISTEN#

LISTEN

LISTEN

LISTEN — слушать уведомление

Синтаксис

LISTEN channel

Описание

LISTEN регистрирует текущую сессию в качестве слушателя на канале уведомлений с именем channel. Если текущая сессия уже зарегистрирована в качестве слушателя для этого канала уведомлений, ничего не происходит.

Каждый раз, когда выполняется команда NOTIFY channel, либо этой сессией, либо другой, подключенной к той же базе данных, все сессии, которые в данный момент прослушивают этот канал уведомлений, получают уведомление, и каждая из них в свою очередь уведомляет свое подключенное клиентское приложение.

Сессия может быть отменена для заданного канала уведомлений с помощью команды UNLISTEN. Регистрации прослушивания сессии автоматически очищаются при завершении сессии.

Метод, который клиентское приложение должно использовать для обнаружения уведомлений, зависит от того, какой интерфейс программирования приложений Tantor SE используется. С библиотекой libpq приложение выполняет команду LISTEN как обычную SQL-команду, а затем периодически вызывает функцию PQnotifies, чтобы узнать, были ли получены какие-либо уведомления. Другие интерфейсы, такие как libpgtcl, предоставляют более высокоуровневые методы для обработки уведомлений; на самом деле, с libpgtcl программист приложения не должен даже выполнять команды LISTEN или UNLISTEN напрямую. Дополнительные сведения см. в документации по используемому интерфейсу.

Параметры

channel

Имя канала уведомлений (любой идентификатор).

Примечания

Влияние команды LISTEN проявляется при коммите транзакции. Если команда LISTEN или UNLISTEN выполняется внутри транзакции, которая позже откатывается, то набор прослушиваемых каналов уведомлений остается неизменным.

Транзакция, которая выполнила команду LISTEN, не может быть подготовлена для двухфазного коммита.

Существуют условия гонки при первоначальной настройке прослушивающей сессии: если транзакции, выполняющиеся параллельно, отправляют уведомления, какие из них получит новая прослушивающая сессия? Ответ заключается в том, что сессия получит все события, подтвержденные после момента во время коммита транзакции. Но это происходит немного позже, чем любое состояние базы данных, которое транзакция могла наблюдать в запросах. Из этого следует следующее правило для использования команды LISTEN: сначала выполните (и закоммитьте!) эту команду, затем в новой транзакции проверьте состояние базы данных по мере необходимости для логики приложения, а затем полагайтесь на уведомления, чтобы узнать о последующих изменениях состояния базы данных. Первые несколько полученных уведомлений могут относиться к обновлениям, уже замеченным при первоначальном осмотре базы данных, но это обычно безвредно.

Содержит более подробное обсуждение использования команды LISTEN и NOTIFY.

Примеры

Настройка и выполнение последовательности listen/notify из psql:

LISTEN virtual;
NOTIFY virtual;
Asynchronous notification "virtual" received from server process with PID 8448.

Совместимость

В стандарте SQL нет оператора LISTEN.

См. также

NOTIFY, UNLISTEN