2014-01-08 4 views
1

로드 균형 조정을 사용하는 pgpool-II를 실행 중이므로 클러스터의 두 서버에 읽기 전용 쿼리가 전송됩니다.업데이트를 통한 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

읽기/쓰기 트랜잭션을 Explcitly 엽니 다. 트랜잭션이 동등 마스터, 또는 SET transaction_read_only = off로 이동해야

BEGIN TRANSACTION READ WRITE; 

는 PgPool 말할 수 있습니다.

필자는 PgPool이 명령문을 마스터 노드로 라우트하기위한 주석 힌트를 지원한다고 생각했지만 문서의 빠른 스캔에서 그 참조를 보지 못했습니다.

다른 옵션은 PgPool을 수정하여 쿼리 파서가 이와 같이 쓰기 가능한 CTE를 식별하는 것을 더 스마트하게 만듭니다.