LISTEN

LISTEN — перехватывать уведомления


Синтаксис

LISTEN канал

Описание

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

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

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

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


Параметры

канал

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


Примечания

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

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

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

На справочной странице команды NOTIFY можно найти более подробный разбор использования команд LISTEN and NOTIFY.


Примеры

Настройка и выполнение последовательности ожидания/приема уведомления в psql:

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

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

В стандарте SQL нет команды LISTEN.


См. также

NOTIFY, UNLISTEN