pgpool обработва CTE с UPDATE

Изпълнявам 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 да разпознае това като заявка за запис, така че трябва ли да отделя записа?


person Jeremy Wilson    schedule 08.01.2014    source източник


Отговори (1)


Изрично отваряне на транзакция за четене/запис.

BEGIN TRANSACTION READ WRITE;

за да кажете на PgPool, че транзакцията трябва да отиде до главния, или SET transaction_read_only = off, което е еквивалентно.

Мислех, че PgPool поддържа съвети за коментари за насочване на изрази към главния възел, но не видях препратки към това при бързо сканиране на документите.

Другата ви опция е да закърпите PgPool, за да направите своя анализатор на заявки по-умен за идентифициране на записваеми CTE като този.

person Craig Ringer    schedule 09.01.2014