我正在运行启用了负载均衡的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将其识别为写入查询,那么我应该将写入分开吗?
答案 0 :(得分:2)
Explcitly打开读/写事务。
BEGIN TRANSACTION READ WRITE;
告诉PgPool该交易应该转到主人,或SET transaction_read_only = off
,这是等同的。
我认为PgPool支持将语句路由到主节点的注释提示,但是在快速扫描文档时没有看到对此的引用。
您的另一个选择是修补PgPool,使其查询解析器更智能地识别这样的可写CTE。