Transação autônoma em Oracle PL / SQL: Commit, Rollback

Índice:

Anonim

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

TCL significa Transaction Control Statements. Isso salvará as transações pendentes ou reverterá a transação pendente. Essas instruções desempenham um papel vital porque, a menos que a transação seja salva, as alterações por meio de instruções DML não serão salvas no banco de dados. Abaixo estão as diferentes instruções TCL.

COMPROMETER-SE Salva todas as transações pendentes
ROLLBACK Descartar todas as transações pendentes
SALVAR PONTO Cria um ponto na transação até que a reversão possa ser feita mais tarde
ROLLBACK TO Descartar todas as transações pendentes até o especificado

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

  • Quando qualquer uma das declarações acima é emitida (exceto SAVEPOINT)
  • Quando as instruções DDL são emitidas. (DDL são declarações de auto-commit)
  • QUANDO as declarações DCL são emitidas. (DCL são declarações de auto-commit)

O que é transação autônoma

No PL / SQL, todas as modificações feitas nos dados serão denominadas como uma transação. Uma transação é considerada concluída quando o salvamento / descarte é aplicado a ela. Se nenhum salvamento / descarte for fornecido, a transação não será considerada como concluída e as modificações feitas nos dados não se tornarão permanentes no servidor.

Independentemente de algumas modificações feitas durante uma sessão, o PL / SQL tratará toda a modificação como uma única transação e salvar / descartar essa transação afeta todas as alterações pendentes naquela sessão. A Transação Autônoma fornece uma funcionalidade ao desenvolvedor na qual permite fazer alterações em uma transação separada e salvar / descartar essa transação específica sem afetar a transação da sessão principal.

  • Esta transação autônoma pode ser especificada no nível do subprograma.
  • Para fazer qualquer subprograma funcionar em uma transação diferente, a palavra-chave 'PRAGMA AUTONOMOUS_TRANSATION' deve ser fornecida na seção declarativa desse bloco.
  • Ele instruirá o compilador a tratar isso como a transação separada e o salvamento / descarte dentro desse bloco não refletirá na transação principal.
  • A emissão de COMMIT ou ROLLBACK é obrigatória antes de sair desta transação autônoma para a transação principal porque a qualquer momento apenas uma transação pode estar ativa.
  • Assim, depois de fazer uma transação autônoma, precisamos salvá-la e concluir a transação, apenas podemos voltar para a transação principal.

Sintaxe:

DECLAREPRAGMA AUTONOMOUS_TRANSACTION;.BEGIN[COMMIT|ROLLBACK]END;/
  • Na sintaxe acima, o bloqueio foi feito como uma transação autônoma.

Exemplo 1 : Neste exemplo, vamos entender como a transação autônoma está funcionando.

DECLAREl_salary NUMBER;PROCEDURE nested_block ISPRAGMA autonomous_transaction;BEGINUPDATE empSET salary = salary + 15000WHERE emp_no = 1002;COMMIT;END;BEGINSELECT 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 empSET salary = salary + 5000WHERE 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;

Resultado

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

Explicação do código:

  • Linha de código 2 : Declarando l_salary como NUMBER.
  • Linha de código 3 : Declarando o procedimento nested_block
  • Linha de código 4 : tornando o procedimento nested_block como 'AUTONOMOUS_TRANSACTION'.
  • Linha de código 7-9: Aumentando o salário do funcionário número 1002 em 15000.
  • Linha de código 10: Confirmando a transação.
  • Linha de código 13-16: Impressão dos detalhes do salário do funcionário 1001 e 1002 antes das alterações.
  • Linha de código 17-19: Aumentando o salário do funcionário número 1001 em 5000.
  • Linha de código 20: chamando o procedimento nested_block;
  • Linha de código 21: Descartando a transação principal.
  • Linha de código 22-25: Impressão dos detalhes do salário do funcionário 1001 e 1002 após as alterações.
  • O aumento de salário para o funcionário número 1001 não é refletido porque a transação principal foi descartada. O aumento de salário para o funcionário número 1002 é refletido porque esse bloqueio foi feito como uma transação separada e salvo no final.
  • Portanto, independentemente de salvar / descartar na transação principal, as alterações na transação autônoma foram salvas sem afetar as alterações na transação principal.