Controle de Transações em PL/SQL

Olá pessoal, hoje vamos falar sobre um assunto muito importante em bancos de dados: o controle de transações em PL/SQL. Depois desta aula, você será capaz de:

  • Utilizar os comandos COMMIT, ROLLBACK e SAVEPOINT
  • Usar o comando SET TRANSACTION

Então vamos lá, mãos à obra!

O que é uma Transação?

No Oracle, uma transação é uma única instrução SQL ou uma série delas que o banco de dados trata como uma unidade única. Isso significa que todas as instruções na unidade ou têm sucesso ou falham juntas.

Cada aplicação (SQL*Plus, SQL Developer, e várias ferramentas PL/SQL de terceiros) mantém uma única sessão de banco de dados para cada instância de login de usuário. As alterações nos dados feitas por uma única sessão são visíveis apenas dentro dessa sessão e não são visíveis para nenhuma outra sessão até que sejam confirmadas (committed) no banco de dados, ou em outras palavras, “salvas”. Se as mudanças nos dados não foram confirmadas, elas podem ser descartadas ou revertidas (rolled back).

O PL/SQL usa comandos da Linguagem de Controle de Transações (TCL) para gerenciar o processamento de transações. Nesta aula, você aprenderá como usar os comandos COMMIT, ROLLBACK, SAVEPOINT e SET TRANSACTION.

Os Comandos COMMIT, ROLLBACK e SAVEPOINT

Uma transação de banco de dados começa quando a primeira instrução DML (Data Manipulation Language) ou DDL (Data Definition Language) é executada e termina de várias maneiras:

  • Um comando COMMIT ou ROLLBACK (sem SAVEPOINT) é executado.
  • Uma instrução DDL como CREATE ou ALTER é encontrada.
  • Um usuário encerra a sessão do banco de dados normalmente; ou seja, a sessão não é encerrada de forma anormal.

Quando um comando COMMIT é emitido, todas as alterações de dados na transação se tornam permanentes e visíveis para outros usuários que possam estar usando as mesmas estruturas de dados. Por outro lado, quando um comando ROLLBACK é emitido, todas as alterações de dados na transação são desfeitas e os dados retornam ao seu estado anterior.

Um comando SAVEPOINT permite que você divida uma transação em unidades menores para que possa reverter uma parte da transação para o savepoint. Isso significa que todas as instruções emitidas após o savepoint são revertidas, e todas as instruções antes do savepoint permanecem.

Agora, vamos criar a tabela TEST_TAB e inserir alguns registros para viabilizar os exemplos que vimos. Aqui estão os comandos SQL:

Agora, vamos ver um exemplo prático. Considere o código:

Neste exemplo, você insere um novo registro na tabela TEST_TAB. Em seguida, você define o savepoint A, atualiza uma única linha na tabela TEST_TAB e exibe os valores recém-atualizados na tela. Após a instrução UPDATE, você reverte suas alterações para o savepoint A e confirma o restante da transação.

Os comandos SELECT antes e depois do exemplo ilustram como as alterações de dados são refletidas na TEST_TAB antes e depois do script.

Observe como as alterações emitidas pela instrução UPDATE não são refletidas na tabela TEST_TAB.

Devido à natureza de uma transação de banco de dados, um bloco PL/SQL pode conter várias transações, e uma única transação pode abranger vários blocos PL/SQL. Considere o seguinte bloco PL/SQL que contém três transações, onde as duas primeiras são confirmadas e a terceira é revertida.

Agora, considere uma versão modificada do mesmo exemplo em que uma única transação abrange dois blocos PL/SQL.

Após esses dois exemplos, a TEST_TAB contém registros como os seguintes:

O Comando SET TRANSACTION

O comando SET TRANSACTION permite especificar várias características de uma transação:

  • Uma cláusula READ ONLY ou READ WRITE define uma transação como somente leitura, o que significa que nenhuma alteração nos dados é permitida, ou como leitura/gravação, o que significa que alterações nos dados são permitidas.
  • Uma cláusula ISOLATION LEVEL define o modo de isolamento da transação como SERIALIZABLE ou READ COMMITTED, determinando assim o comportamento da transação.
  • Uma cláusula USE ROLLBACK SEGMENT define a transação como leitura/gravação implicitamente e atribui a transação a um segmento de rollback específico.
  • Uma cláusula NAME permite que você nomeie a transação.

A documentação do Oracle contém informações detalhadas sobre o comando SET TRANSACTION e suas opções.

Vale ressaltar que o comando SET TRANSACTION deve ser o primeiro comando na transação e pode aparecer apenas uma vez. No entanto, não é necessário para iniciar uma transação, como ilustrado na seção anterior.

Vejamos um exemplo simples que ilustra como o comando SET TRANSACTION pode ser usado.

Neste exemplo, você define uma transação somente leitura que determina a data de hoje. Observe os dois comandos COMMIT usados neste script. O primeiro comando COMMIT encerra qualquer transação anterior que você possa ter iniciado nesta sessão. O segundo comando COMMIT encerra a transação ‘Get date' somente leitura.

Nesta aula, aprendemos sobre:

  • Transações no Oracle e como elas funcionam
  • Os comandos COMMIT, ROLLBACK e SAVEPOINT para controlar transações
  • O comando SET TRANSACTION e suas opções

Agora você já sabe como controlar transações em PL/SQL! Pratique bastante esses conceitos para fixá-los.

Scroll to Top