2014-01-08 30 views
1

我正在運行啓用了負載平衡的pgpool-II,以便它將只讀查詢發送到羣集中的兩臺服務器。使用UPDATE更新CTE的pgpool處理

但是,在某些情況下,我擁有包含UPDATE命令的CTE查詢,但底層查詢是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認識到這是一個寫入查詢,所以我應該分離出寫?

回答

2

顯式打開讀/寫事務。

BEGIN TRANSACTION READ WRITE; 

告訴PgPool該交易應該去掌握,或SET transaction_read_only = off,相當於。

我認爲PgPool支持將語句路由到主節點的評論提示,但是沒有在文檔的快速掃描中看到引用。

您的其他選擇是修補PgPool,使其查詢解析器更聰明地識別這樣的可寫CTE。