NOTIFY
Уведомление всех серверных процессов, ожидающих некоторого события.
Синтаксис:
NOTIFY событие
Параметры:
Событие, о наступлении которого оповещаются процессы.
Результаты:
NOTIFY. Это сообщение выдается в том случае, если рассылка прошла успешно.
Описание
Команда NOTIFY работает в сочетании с командой LISTEN, описанной выше. Эти две команды обеспечивают простой механизм межпроцессных взаимодействий, который при правильном применении способен принести существенную пользу.
Команда NOTIFY рассылает уведомление о событии с заданным именем; если какая-либо клиентская программа ранее выполнила команду LISTEN с тем же именем события, она получает уведомление.
Примечание
Поведение клиентского процесса после получения уведомления, отправленного командой NOTIFY, полностью зависит от реализации, поэтому процесс может немедленно отреагировать на происходящее, а может ничего не делать.
Уведомление содержит информацию об имени события и идентификаторе серверного процесса, рассылающего уведомления. Проектировщик базы данных определяет имена событий и реакцию на них со стороны базы данных.
Команды NOTIFY и LISTEN чаще всего применяются для оповещения клиентских процессов о модификации таблиц, поэтому имена событий часто совпадают с именами таблиц. Впрочем, это всего лишь распространенный вариант использования этих команд; совпадение имен событий с именами таблиц не обязательно.
Примечание
Автоматическое уведомление об изменениях в таблицах достигается включением команды NOTIFY в правило, срабатывающее при обновлении таблицы.
Транзакции
Следует обратить внимание на особенности выполнения команды NOTIFY в транзакциях. Самая важная особенность заключается в том, что рассылка уведомлений по команде NOTIFY в транзакциях откладывается до момента фиксации. Тем самым предотвращается рассылка уведомлений транзакциями, которые в дальнейшем могут быть откачены.
Также следует учитывать, что серверный процесс не доставляет уведомление подключенному клиенту при наличии незавершенной транзакции. Если в клиентском процессе в настоящее время существует открытая транзакция, серверный процесс отправляет уведомление лишь после того, как транзакция будет завершена командой COMMIT или ROLLBACK.
Повторные сигналы
Поведение пары команд NOTIFY и LISTEN напоминает систему сигналов в Unix. Даже если уведомление рассылается многократно несколькими командами NOTIFY, ожидающие процессы получают его только один раз.
По этой причине количество принятых уведомлений не может использоваться для накопления значений счетчиков или отслеживания важных событий, происходящих в базе данных. В правильной реализации эти действия выполняются с применением команды NOTIFY с объектом последовательности (или его аналогом).
Пример
В следующем фрагменте первая команда определяет некоторое событие, а вторая команда уведомляет серверный процесс о наступлении этого события:
booktown=# LISTEN publisherjteletion; LISTEN booktown=# NOTIFY publisherjjeletlon; Asynchronous NOTIFY 'publisher_deletion' from backend with pid '16864' received.