Transação autônoma em Oracle PL/SQL

⚡ Resumo Inteligente

Instruções de Controle de Transações em Oracle Em PL/SQL, especificamente nos comandos COMMIT, ROLLBACK e SAVEPOINT, é possível decidir se as alterações DML pendentes serão salvas ou descartadas. Uma transação autônoma é executada como um subprograma independente que confirma ou reverte as alterações separadamente da transação principal.

  • 💾 COMPROMETER-SE: Torna permanentes todas as alterações DML pendentes, encerra a transação, libera os bloqueios e apaga todos os pontos de salvamento.
  • ↩️ REVERTER: Desfaz as alterações pendentes, seja a transação inteira ou reverte para um ponto de salvamento especificado.
  • 📌 PONTO DE SALVAMENTO: Marca um ponto dentro de uma transação para que um ROLLBACK TO posterior possa desfazer apenas parte do trabalho.
  • 🔀 Transação Autônoma: A diretiva PRAGMA AUTONOMOUS_TRANSACTION permite que um subprograma confirme ou reverta suas ações automaticamente.
  • 🧾 Casos de uso: Transações autônomas são adequadas para auditoria e registro de erros que devem persistir mesmo se o trabalho principal for revertido.
  • 🤖 Assistência de IA: Assistentes de IA como o GitHub Copilot elaboram rascunhos de blocos COMMIT, ROLLBACK e PRAGMA e sinalizam commits ausentes.

Transação autônoma em Oracle PL/SQL com COMMIT e ROLLBACK

O que são instruções TCL em PL/SQL?

TCL significa Instruções de Controle de Transação. Essas instruções salvam ou revertem as transações pendentes. Elas desempenham um papel vital, pois, a menos que uma transação seja salva, as alterações feitas por meio dela não serão revertidas. Declarações DML não serão armazenados permanentemente no banco de dados. Abaixo estão as diferentes instruções TCL em PL/SQL.

Declaração Descrição
COMPRAR Salva todas as transações pendentes.
RECUPERAR Descarta todas as transações pendentes.
SALVAR PONTO Cria um ponto na transação até o qual um rollback pode ser feito posteriormente.
REVERTER PARA Descarta todas as transações pendentes até o ponto de salvamento especificado.

A transação será concluída nos seguintes cenários:

  • Quando qualquer uma das declarações acima for emitida (exceto SAVEPOINT).
  • Quando instruções DDL são emitidas (DDL são instruções de confirmação automática).
  • Quando instruções DCL são emitidas (DCL são instruções de confirmação automática).

Usando SAVEPOINT e ROLLBACK TO

A tabela acima apresenta os conceitos de SAVEPOINT e ROLLBACK TO, que juntos oferecem controle parcial sobre uma transação. Um SAVEPOINT marca um ponto específico dentro da transação atual. Um ROLLBACK TO posterior a esse ponto de salvamento desfaz todas as alterações feitas após ele, enquanto mantém as alterações existentes.ping o trabalho realizado anteriormente permaneceu intacto.

Isso é útil quando uma transação longa executa várias etapas. SQL etapas e apenas a última etapa falha. Em vez de descartar toda a transação, você pode reverter para o último ponto de salvamento válido e continuar.

Sintaxe:

SAVEPOINT <savepoint_name>;
   -- one or more DML statements
ROLLBACK TO <savepoint_name>;

Pontos importantes a lembrar sobre os pontos de salvamento:

  • Um ponto de salvamento existe apenas dentro da transação atual; um COMMIT ou um ROLLBACK completo apaga todos os pontos de salvamento.
  • Ao retornar a um ponto de salvamento, quaisquer pontos de salvamento criados posteriormente serão apagados, mas o ponto de salvamento para o qual você retornou será mantido.
  • ROLLBACK TO não finaliza a transação; as alterações feitas antes do ponto de salvamento permanecem pendentes até que você execute COMMIT ou ROLLBACK.
  • Se você reutilizar o nome de um ponto de salvamento, o novo SAVEPOINT moverá o marcador para a posição posterior.

Como o ROLLBACK TO mantém a transação aberta, você ainda decide no final se deseja CONFIRMAR as alterações restantes ou descartá-las com um ROLLBACK completo.

O que é transação autônoma

Em PL/SQL, todas as modificações feitas nos dados são chamadas de transação. Uma transação é considerada completa quando um comando de salvar ou descartar é aplicado a ela. Se nenhum comando de salvar ou descartar for executado, a transação não é considerada completa e as modificações feitas nos dados não serão tornadas permanentes no servidor.

Por padrão, o PL/SQL trata todas as modificações durante uma sessão como uma única transação, e salvar ou descartar essa transação afeta todas as alterações pendentes na sessão. Uma transação autônoma permite ao desenvolvedor fazer alterações em uma transação separada e salvar ou descartar essa transação específica sem afetar a transação principal da sessão.

  • Uma transação autônoma pode ser especificada no nível do subprograma.
  • Para fazer qualquer subprograma Para trabalhar em uma transação diferente, a palavra-chave PRAGMA AUTONOMOUS_TRANSACTION deve ser fornecida na seção declarativa desse bloco.
  • Isso instrui o compilador a tratar isso como uma transação separada, e salvar ou descartar dentro deste bloco não terá reflexo na transação principal.
  • É obrigatório enviar um COMMIT ou ROLLBACK antes de sair desta transação autônoma e retornar à transação principal, pois apenas uma transação pode estar ativa por vez.
  • Assim, uma vez iniciada uma transação autônoma, ela deve ser salva e concluída antes que o controle possa retornar à transação principal.

Sintaxe:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
.
BEGIN
<execution_part>
[COMMIT|ROLLBACK]
END;
/

Na sintaxe acima, o bloco foi transformado em uma transação autônoma.

1 exemplo: Neste exemplo, vamos entender como funciona uma transação autônoma.

A captura de tela abaixo mostra este exemplo de transação autônoma e sua saída em Oracle.

Exemplo de transação autônoma que confirma um bloco aninhado enquanto a transação principal é revertida. Oracle PL/SQL

DECLARE
   l_salary   NUMBER;
   PROCEDURE nested_block IS
   PRAGMA autonomous_transaction;
    BEGIN
     UPDATE emp
       SET salary = salary + 15000
       WHERE emp_no = 1002;
   COMMIT;
   END;
BEGIN
   SELECT salary INTO l_salary FROM emp WHERE emp_no = 1001;
   dbms_output.put_line('Before Salary of 1001 is'|| l_salary);
   SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;
   dbms_output.put_line('Before Salary of 1002 is'|| l_salary);    
   UPDATE emp 
   SET salary = salary + 5000 
   WHERE emp_no = 1001;

nested_block;
ROLLBACK;

 SELECT salary INTO  l_salary FROM emp WHERE emp_no = 1001;
 dbms_output.put_line('After Salary of 1001 is'|| l_salary);
 SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;
 dbms_output.put_line('After Salary of 1002 is '|| l_salary);
end;

saída

Before:Salary of 1001 is 15000 
Before:Salary of 1002 is 10000 
After:Salary of 1001 is 15000 
After:Salary of 1002 is 25000

Code Explicação:

  • Code linha 2: Declarando l_salary como NÚMERO.
  • Code linha 3: Declarando o procedimento nested_block.
  • Code linha 4: Transformando o procedimento nested_block em uma AUTONOMOUS_TRANSACTION.
  • Code linhas 7-9: Aumentar o salário do funcionário número 1002 em 15000.
  • Code linha 10: Confirmando a transação autônoma.
  • Code linhas 13-16: Impressão dos detalhes salariais dos funcionários 1001 e 1002 antes das alterações.
  • Code linhas 17-19: Aumentar o salário do funcionário número 1001 em 5000.
  • Code linha 20: Chamando o procedimento nested_block.
  • Code linha 21: Descartando a transação principal.
  • Code linhas 22-25: Impressão dos detalhes salariais dos funcionários 1001 e 1002 após as alterações.

O aumento salarial do funcionário número 1001 não foi refletido porque a transação principal foi descartada. O aumento salarial do funcionário número 1002 foi refletido porque esse bloco foi transformado em uma transação separada e salvo ao final.

Assim, independentemente de salvar ou descartar na transação principal, as alterações na transação autônoma são salvas sem afetar a transação principal.

Quando usar transações autônomas

Transações autônomas são poderosas, por isso é importante saber quando usá-las. Reserve-as para tarefas que precisam ser concluídas com sucesso ou falhar independentemente da transação principal, e não para a lógica de negócios essencial. Casos de uso comuns incluem:

  • Registro de auditoria: Registre quem alterou os dados confidenciais, quando e os valores antigos e novos, para que o registro permaneça válido mesmo se a transação principal for revertida.
  • Erro ao registrar: Escreva um registro de erro dentro de um exceção manipulador e COMMITe-o, de forma que os detalhes de diagnóstico sejam mantidos enquanto a transação com falha é descartada.
  • Contadores e estatísticas: Avançar um contador de uso ou de acessos que deve persistir independentemente do resultado da chamada.
  • COMMIT dentro de um gatilho: Um gatilho não pode emitir um COMMIT diretamente; uma transação autônoma é a única maneira suportada de fazê-lo.

Evite transações autônomas para atualizações comuns que devem compartilhar o destino da transação principal. O uso excessivo delas pode ocultar dados por trás de commits independentes e dificultar a depuração. Como regra geral, todo bloco autônomo deve terminar com um COMMIT ou ROLLBACK explícito.

Transações autônomas versus transações regulares

A diferença entre uma transação regular (principal) e uma transação autônoma reside no escopo e na independência. A tabela abaixo compara-as.

Aspecto Transação regular Transação Autônoma
Objetivo Compartilha uma transação de sessão Executa como uma transação filha separada.
Efeito COMMIT/ROLLBACK Afeta todas as alterações de sessão pendentes. Afeta apenas o bloco autônomo
Declaração Comportamento padrão PRAGMA AUTONOMOUS_TRANSACTION na seção declarativa
Efeito do rollback do pai As alterações se perdem As alterações autônomas confirmadas são mantidas.
Uso típico Lógica central do negócio Auditoria e registro de erros

Ao contrário de um normal bloco aninhadoUm bloco independente, cujas alterações sempre compartilham o resultado da transação que o contém, é um bloco autônomo. Compreender essa diferença ajuda a decidir quando um bloco deve ser independente e quando deve compartilhar o resultado da transação principal.

Perguntas Frequentes

Oracle Gera o erro ORA-06519 e reverte o trabalho autônomo. Toda transação autônoma deve ser finalizada com um COMMIT ou ROLLBACK explícito antes que o controle retorne à transação principal, pois apenas uma transação ativa é permitida por vez.

Não diretamente. Um gatilho normal não pode emitir COMMIT ou ROLLBACK. Declarar o gatilho, ou um procedimento que ele chama, com PRAGMA AUTONOMOUS_TRANSACTION permite que ele confirme suas próprias alterações independentemente da instrução que disparou o gatilho.

Não. Uma vez que a transação pai é suspensa, a transação autônoma é executada independentemente e não consegue ver as alterações não confirmadas da transação pai. Ela vê apenas os dados já confirmados no banco de dados, portanto, esperar por um bloqueio da transação pai pode causar um deadlock.

Sim. Cada instrução DDL, como CREATE, ALTER ou DROP, emite um COMMIT implícito antes e depois de sua execução. Qualquer DML pendente na sessão é confirmado automaticamente, portanto, uma instrução DDL não pode ser revertida posteriormente.

Um bloco autônomo pode chamar outro, e cada um gerencia seu próprio COMMIT ou ROLLBACK. Oracle O parâmetro de inicialização TRANSACTIONS limita o número de transações ativas simultaneamente, portanto, o aninhamento muito profundo de blocos autônomos pode falhar.

Não. Um COMMIT torna as alterações permanentes, libera bloqueios e apaga pontos de salvamento, portanto, não pode ser desfeito com ROLLBACK. Para reverter os dados confirmados, você deve executar um novo comando DML. Use SAVEPOINT e ROLLBACK TO para desfazer parcialmente as alterações antes de confirmar.

Sim. Travas deslizantes portáteis Copiloto do GitHub Extrai lógica COMMIT e ROLLBACK, blocos SAVEPOINT e procedimentos PRAGMA AUTONOMOUS_TRANSACTION de um comentário. RevObserve o posicionamento do commit e o tratamento de erros, pois um commit mal posicionado pode corromper os limites da transação.

Assistentes de IA examinam os procedimentos em busca de instruções COMMIT e ROLLBACK ausentes ou mal posicionadas, commits dentro de loops e blocos autônomos não fechados. Essa revisão por aprendizado de máquina sinaliza erros de transação e sugere limites mais seguros antes que o código chegue à produção.

Resuma esta postagem com: