PURGE TRANSACTION

Dúvidas, dicas e atualizações sobre o Treinamento Oracle Tuning - SQL.
Post Reply
leonardopedroso

PURGE TRANSACTION

Post by leonardopedroso »

Pessoal,
vira e mexe tenho que limpar algumas transações distribuídas que ficam retidas na DBA_2PC_PENDING. Antes de começar a limpar mudo o parametro: "_smu_debug_mode" = 4, e depois executo o ROLLBACK FORCE 'XX.XXXX.XX' + DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('XXX.XXXX.XXX'). Após isso procedo com o commit e vejo que a sessão foi expurgada. Faço um select novamente na DBA_2PC_PENDING e vejo que foram limpas.

O problema é que eu tenho esse trabalho praticamente toda semana. É viável colocar um job para fazer isso automaticamente ou tem algum parâmetro que já mata essas transações? Eu queria mesmo descobrir a causa raiz, pelos relatos na internet são problemas relacionados á rede e componentes antigos que por algum motivo finalizam a transação.

Tem algum problema em deixar o SMU_DEBUG_MODE como 4?

portilho
Site Admin
Posts: 498
Joined: Wed May 29, 2013 8:51 am

Re: PURGE TRANSACTION

Post by portilho »

A causa raiz geralmente é um problema de rede entre os bancos. Os parâmetros do SQLNET.ORA dos dois lados devem estar de acordo com o ambiente para evitar TIMEOUTs.
Veja também seus parâmetros OPEN_LINKS, OPEN_LINKS_PER_INSTANCE, e DISTRIBUTED_LOCK_TIMEOUT.

Por que você precisa do SMU_DEBUG_MODE?

Eu acho que poderia automatizar sim. Faz uma Procedure que pegue o FAIL_TIME maior que SYSDATE-1, por exemplo, e já faz o ROLLBACK FORCE e DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY.

leonardopedroso

Re: PURGE TRANSACTION

Post by leonardopedroso »

Portilho, vi que de vez em quando róla uns timeouts na rede, então de fato isso pode ser a causa raiz, criei um job para fazer isso todo domingo:

declare
xid varchar2(22);
begin
for c1 in (select LOCAL_TRAN_ID FROM DBA_2PC_PENDING) loop
dbms_transaction.PURGE_LOST_DB_ENTRY(c1.LOCAL_TRAN_ID);
commit;
end loop;
end;

Isso já resolve meu problema, o estranho é que quando essa transação cai, se você rodar o mesmo comando ele fala que o recurso está retido pela transação distribuída:
--[1]: (Error): ORA-01591: bloqueio retido pela transação distribuída 3975.8.24398

Quando essa transação cai inesperadamente, os blocos ou registros ficam presos até que eu limpe-a? Essa transação 3975.8.24398 impediu um select rodar até que eu achei a solução e limpei.

portilho
Site Admin
Posts: 498
Joined: Wed May 29, 2013 8:51 am

Re: PURGE TRANSACTION

Post by portilho »

Aumente o parâmetro DISTRIBUTED_LOCK_TIMEOUT, o padrão dele é 60 segundos, e acompanhe se estas ocorrências diminuem.
E sim, se esta transação possuía recursos bloqueados (Lock), eles continuarão bloqueados até que a transação seja finalizada.

Post Reply