Это интересный вопрос.Возможно, документация неясна, но по моему опыту дублированные уведомления отправляются только в рамках субтранзакций.
Чтобы не просто догадываться, давайте откроем исходный код PostgreSQL.Функция уведомления имеет тест дубликатов :
/* no point in making duplicate entries in the list ... */
if (AsyncExistsPendingNotify(channel, payload))
return;
Хорошо, но она не объясняет возможность дубликатов.Итак, мы можем двигаться вперед и проверить функцию AsyncExistsPendingNotify .Где-то внутри этой функции мы нашли наш ответ в комментарии:
/*
* As we are not checking our parents' lists, we can still get duplicates
* in combination with subtransactions, like in:
*
* begin;
* notify foo '1';
* savepoint foo;
* notify foo '1';
* commit;
*/
Итак, вот и все.Мы можем иметь дублированные уведомления при использовании субтранзакций.Документация может быть более понятной, но, возможно, люди из PostgreSQL сделали это намеренно.Поэтому я могу сделать вывод, что избегание дубликатов в этом случае не является строгим требованием.