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