Я запускаю 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 распознавать это как запрос на запись, поэтому я должен отделить запись?