Olá Pessoal,

Tenho um cenário em que a aplicação de produção deixa com frequencia
sessions prepared no banco.  De forma que o paliativo para não causar mais
indisponibilidade seria construir uma function, onde verificaria se a
session prepared estaria a mais de X minutos, em caso afirmativo seria
executado o rollback prepared.

Construi a function abaixo, porém ao executar no banco em que existe a
session prepared simplesmente o rollback não é feito.   Caso alguém possa
ajudar ficaria agradecido

CREATE or replace FUNCTION remove_prepared() RETURNS text AS $$
DECLARE
    var_qtd_prepared integer;
    varre record;
    text_var1 text;
    text_var2 text;
    text_var3 text;
    var_command_string text;
BEGIN

   select count(1)
     into var_qtd_prepared
      from pg_prepared_XACTS;

   if (var_qtd_prepared > 0) then

       for varre in (  SELECT gid, prepared, database
       FROM pg_prepared_XACTS
      where age(now(),prepared) >= '30 minutes'
    )
      loop

          begin
             RAISE INFO 'Database: %',varre.database;
             RAISE INFO 'Prepared: %',varre.prepared;
             RAISE INFO 'Gid: %',varre.gid;

             var_command_string := 'ROLLBACK PREPARED '''||varre.gid||'''';

     RAISE INFO '%',var_command_string;
             execute var_command_string;
             RAISE INFO '-----------------------------------';
             exception when others then
                 GET STACKED DIAGNOSTICS text_var1 = MESSAGE_TEXT,
                          text_var2 = PG_EXCEPTION_DETAIL,
                          text_var3 = PG_EXCEPTION_HINT;
          end;
      end loop;

   end if;
   return null;
END;
$$ LANGUAGE remove_prepared;




-- 
Atenciosamente
Francisco Porfirio Ribeiro Neto
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a