Tivemos uma situação onde precisávamos executar um select dentro de uma Trigger de insert e update da mesma tabela. Como estamos referenciando no select a mesma tabela pela qual a trigger foi disparada, seria estourado o erro ORA-04091: table name is mutanting.

Para isso usamos uma diretiva de compilação (PRAGMA) para dizer ao compilador do Oracle que o código será executado em uma transação independente, autônoma:

 PRAGMA AUTONOMOUS_TRANSACTION;  

Uma transação autônoma é iniciada por uma outra transação, e executada sem interferir a transação de origem. Quando uma transação autônoma é chamada, a transação de origem é suspensa. O controle é retornado quando a transação autônoma realiza um commit ou um rollback, que não afetará a transação pai.

Uma transação autônoma pode resolver também outros problemas, como exemplo o erro ORA-14551: cannot perform a DML operation inside a query, quando tentamos executar um select em uma table(function), e dentro desta function existe alguma operação DML. Assim, podemos indicar que essa operação DML é uma transação autônoma e com isso não influenciará a transação principal.

Outra ótima utilidade da usar transação autônoma é para uso de log. Caso haja erro em uma operação e gostaríamos de gravar dados sobre este erro em uma tabela de log, executando commit nesta tabela sem influenciar a transação a qual ocorreu o erro.

É muito claro que precisamos tomar muito cuidado com esse tipo de comando pois imagina a complexidade que seria dar manutenção em sistemas repletos de transações autônomas.



Referências:


Deixe um comentário