pgpool обрабатывает CTE с помощью UPDATE

Я запускаю pgpool-II с включенной балансировкой нагрузки, так что он отправляет запросы только для чтения на оба сервера в моем кластере.

Однако в некоторых случаях у меня есть запросы CTE, которые содержат команды UPDATE, но базовым запросом является SELECT, поэтому pgpool отправляет его подчиненному устройству и терпит неудачу из-за природы только для чтения.

Например, этот запрос находит совпадения для отображения и помечает их как просмотренные одновременно:

WITH matches AS (
    WITH user_liked AS (
          SELECT liked_user_id FROM likes WHERE user_id='x' AND active IS TRUE
    )
    SELECT user_id, liked_user_id, liked_user_viewed, created_ts, matched_ts AS pointer
          FROM likes 
          WHERE 
          user_id IN(SELECT * FROM user_liked) 
          AND 
          active IS TRUE
          AND 
          liked_user_id='x' 
          ORDER BY matched_ts DESC
     ),
     update_liked_user_viewed AS (
          UPDATE likes
          SET liked_user_viewed=TRUE
          WHERE liked_user_id='x' AND user_id IN(SELECT user_id FROM matches)
     )
     SELECT * FROM matches

Любые предложения, чтобы заставить pgpool распознавать это как запрос на запись, поэтому я должен отделить запись?


person Jeremy Wilson    schedule 08.01.2014    source источник


Ответы (1)


Явно открыть транзакцию чтения/записи.

BEGIN TRANSACTION READ WRITE;

чтобы сообщить PgPool, что транзакция должна перейти к мастеру, или SET transaction_read_only = off, что эквивалентно.

Я думал, что PgPool поддерживает подсказки комментариев для маршрутизации операторов к главному узлу, но не видел ссылок на это при быстром просмотре документов.

Другой вариант — исправить PgPool, чтобы сделать его синтаксический анализатор запросов более умным в отношении идентификации таких CTE, доступных для записи.

person Craig Ringer    schedule 09.01.2014