PostgreSQL LISTEN / NOTIFY количество уведомлений на транзакцию с одинаковыми полезными нагрузками - PullRequest
0 голосов
/ 26 декабря 2018

В руководстве к PostgreSQL говорится:

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

Знаете ли вы, как принимается это «решение»?

1 Ответ

0 голосов
/ 26 декабря 2018

Это интересный вопрос.Возможно, документация неясна, но по моему опыту дублированные уведомления отправляются только в рамках субтранзакций.

Чтобы не просто догадываться, давайте откроем исходный код 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 сделали это намеренно.Поэтому я могу сделать вывод, что избегание дубликатов в этом случае не является строгим требованием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...