使用 UPDATE 处理 CTE 的 pgpool
Posted
技术标签:
【中文标题】使用 UPDATE 处理 CTE 的 pgpool【英文标题】:pgpool handling of CTEs with UPDATE 【发布时间】:2014-01-08 22:24:44 【问题描述】:我正在运行启用负载平衡的 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 将其识别为写入查询,那么我应该将写入分开吗?
【问题讨论】:
【参考方案1】:显式打开一个读/写事务。
BEGIN TRANSACTION READ WRITE;
告诉 PgPool 事务应该交给主控,或者SET transaction_read_only = off
,这是等价的。
我认为 PgPool 支持将语句路由到主节点的注释提示,但在快速浏览文档时没有看到对它的引用。
您的另一个选择是修补 PgPool 以使其查询解析器更智能地识别此类可写 CTE。
【讨论】:
以上是关于使用 UPDATE 处理 CTE 的 pgpool的主要内容,如果未能解决你的问题,请参考以下文章