Uma transação que termina em rollback desfaz o que fez. Às vezes isso é esperado, como a rotina de um pool de conexões; às vezes revela trabalho perdido depois de um erro. O próprio trace diz qual dos dois casos é.
Sintomas
No Diagnóstico, aparece o achado n rollbacks (ROLLBACK), ou 1 rollback, com o texto Trabalho desfeito também custa tempo; confira se é esperado. e o link Ver resumo. A severidade é baixa, sem percentual do tempo total.
O achado aparece quando o trace tem pelo menos uma linha XCTEND com rlbk=1, que marca o fim de uma transação por rollback. No Resumo, o cartão Comandos distintos mostra, embaixo, quantos commits e rollbacks a sessão fez.
Causa
- A aplicação desfaz a transação depois de um erro.
- O pool de conexões ou o framework faz rollback ao devolver a conexão ou ao fim de cada pedido, muitas vezes sem ter alterado nada.
- Uma rotina simula ou testa uma operação e descarta o resultado.
O custo depende do que a transação alterou: o banco desfaz cada alteração com o undo. Transação que só leu termina sem nada a desfazer, e a linha XCTEND dela traz rd_only=1.
Resolução
- Compare commits e rollbacks no Resumo.
- Conte no trace os rollbacks de transação que alterou dados (
rd_only=0) e os de transação que só leu (rd_only=1):grep -c "XCTEND rlbk=1, rd_only=0" arquivo.trc grep -c "XCTEND rlbk=1, rd_only=1" arquivo.trcResultado: somados, os dois números dão o total de rollbacks do achado.
- Liste as linhas dos rollbacks que desfizeram alterações; o número antes dos dois-pontos é a linha do trace:
grep -n "XCTEND rlbk=1, rd_only=0" arquivo.trc | head - Leia o trecho do trace antes de cada um. Troque 1000 pela linha do rollback:
head -n 1000 arquivo.trc | tail -n 40 - Se há uma linha
ERRORantes do rollback, corrija o erro: veja erros Oracle no trace. - Se não há erro, confirme com quem mantém a aplicação se o rollback faz parte da regra do negócio.
Rollbacks só com rd_only=1 costumam ser rotina do pool ou do framework e custam pouco. Cada um ainda é um pedido ao banco: se as idas e voltas pesam no tempo, veja a sessão esperando a aplicação.
Como confirmar
Depois da correção, gere o trace da mesma operação e compare o número de rollbacks no Resumo e a contagem de rd_only=0 no trace. Quando a causa era um erro, ele também some da seção Erros.
No relatório
- Resumo: o cartão Comandos distintos, com commits e rollbacks embaixo. No exemplo, a sessão não tem rollback (resumo).
- Diagnóstico: o achado e o link Ver resumo (Diagnóstico).
- Erros: os erros que costumam vir antes do rollback. A seção só aparece quando o trace tem erro (erros).
- Perfil do tempo de resposta: o rollback de transação que alterou dados também espera
log file sync(gravação do redo no commit).