LISTEN
LISTEN — прослушивать уведомления
Синтаксис
LISTEN канал
Описание
Команда LISTEN
регистрирует текущий сеанс в качестве прослушивателя
на канале уведомлений с именем канал. Если текущий сеанс уже
зарегистрирован в качестве прослушивателя для этого канала уведомлений,
ничего не происходит.
Всякий раз, когда вызывается команда NOTIFY канал
(в этом
сеансе или в другом, подключенном к той же базе данных), все сеансы,
которые в настоящий момент прослушивают этот канал уведомлений,
получают уведомление и в свою очередь передают его своему подключенному
клиентскому приложению.
Сеанс может быть отменен для данного канала уведомлений с помощью
команды UNLISTEN
. Регистрация прослушивания канала автоматически
очищается по окончании сеанса.
Метод, который клиентское приложение должно использовать для обнаружения
событий уведомления, зависит от того, какой программный интерфейс
приложения QHB оно использует. С библиотекой libpq приложение
выполняет команду LISTEN
как обычную команду SQL, а затем должно
периодически вызывать функцию PQnotifies, чтобы узнать, были ли получены
какие-либо уведомления. Другие интерфейсы, например libpgtcl,
предоставляют более высокоуровневые методы для обработки событий уведомлений;
более того, с libpgtcl программисту приложения даже не нужно запускать
LISTEN
или UNLISTEN
напрямую. Дополнительную информацию см.
в документации по используемому интерфейсу.
Параметры
канал
Наименование канала уведомления (любой идентификатор).
Примечания
Команда LISTEN
вступает в силу при фиксации транзакции. Если LISTEN
или
UNLISTEN
выполняется в транзакции, которая позже откатывается, набор
прослушиваемых каналов уведомлений остается неизменным.
Транзакция, которая выполнила LISTEN
, не может быть подготовлена к
двухфазной фиксации.
При первой настройке сеанса на прослушивание существует условие гонки: если параллельно фиксирующиеся транзакции посылают уведомления о событии, какое из них получит свежеподписавшийся сеанс? Ответ: сеанс получит все события, зафиксированные после момента фиксации транзакции, регистрирующей подписку. Но эти уведомления будут отражать состояния базы данных с некоторым запозданием по сравнению с тем, которое эта транзакция могла бы наблюдать в своих запросах. Это приводит к следующему правилу использования LISTEN
: сначала выполнить (и зафиксировать!) эту команду, затем в новой транзакции проверить состояние базы данных согласно требованиям логики приложения, затем воспользоваться уведомлениями для выявления последующих изменений состояния базы данных. Первые несколько уведомлений могут относиться к изменениям, которые уже наблюдались при исходной проверке базы данных, но обычно в этом нет вреда.
В разделе NOTIFY можно найти более подробный разбор использования команд LISTEN
and NOTIFY
.
Примеры
Настройка и выполнение последовательности listen/notify от qsql:
LISTEN virtual;
NOTIFY virtual;
Asynchronous notification "virtual" received from server process with PID 8448.
Совместимость
В стандарте SQL нет команды LISTEN
.