LISTEN#
LISTEN
LISTEN — слушать уведомление
Синтаксис
LISTEN channel
Описание
LISTEN
регистрирует текущую сессию в качестве слушателя на канале уведомлений с именем channel
.
Если текущая сессия уже зарегистрирована в качестве слушателя для этого канала уведомлений, ничего не происходит.
Каждый раз, когда выполняется команда NOTIFY
, либо этой сессией, либо
другой, подключенной к той же базе данных, все сессии, которые в данный
момент прослушивают этот канал уведомлений, получают уведомление, и каждая
из них в свою очередь уведомляет свое подключенное клиентское приложение.
channel
Сессия может быть отменена для заданного канала уведомлений с помощью команды UNLISTEN
. Регистрации прослушивания сессии автоматически очищаются при завершении сессии.
Метод, который клиентское приложение должно использовать для обнаружения уведомлений, зависит от того, какой интерфейс программирования приложений Tantor BE используется. С библиотекой 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
.