Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Qual é o efeito de colocar o commit após o DML no procedimento?


Qual é o efeito de colocar o commit assim no programa?

A Documentação da Oracle descreve COMMIT como:

Propósito

Use o COMMIT para encerrar sua transação atual e tornar permanentes todas as alterações realizadas na transação. Uma transação é uma sequência de instruções SQL que o Oracle Database trata como uma única unidade. Essa instrução também apaga todos os pontos de salvamento na transação e libera os bloqueios de transação.

Se você tiver três PROCEDURE e cada um contém um COMMIT então você não pode executar todos os três então, se ocorrer uma exceção em um último, ROLLBACK todos eles, pois as alterações dos dois primeiros já serão COMMIT ted.

Como regra geral, você não use COMMIT em um PROCEDURE ou FUNCTION mas deve deixar para o chamador COMMIT a transação para que possam agrupar várias ações.

Existem, é claro, casos de uso em que você desejará violar essa regra, mas você deve considerar cada caso separadamente e dedicar um tempo para entender completamente sua lógica de negócios antes de quebrar essa regra para saber o que é COMMIT tado em cada instância.

Devo fazer esta transação como AUTONOMOUS_TRANSACTION ?

Um caso de uso está registrando - você pode ter um PROCEDURE que chama outro PROCEDURE para registrar as ações do usuário e, independentemente de a ação inicial ter sucesso ou falhar, você deseja manter um registro da ação e garantir que o registro seja COMMIT ted. Nesse caso, o registro PROCEDURE deve ser um AUTONOMOUS_TRANSACTION e conter um COMMIT e a instrução de chamada não deve (provavelmente) ter nenhum.

Então, se o COMMIT de um PROCEDURE é sempre necessário e é independente se o chamador COMMIT s outros dados, em seguida, faça o PROCEDURE um AUTONOMOUS_TRANSACTION . Se o PROCEDURE s podem ser agrupados e então ROLLBACK como um grupo, então você não quer torná-los AUTONOMOUS_TRANSACTION s.