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
.