Por que eu devo ler este artigo:Nesse artigo apresentaremos um passo a passo sobre a utilização dos comandos commit, rollback e savepoint.

Transação - Uma transação é um conjunto de operações, delimitadas por um início e um fim. Iniciando quando se executa o primeiro comando SQL e terminando de acordo com as seguintes situações:

Commit Comando que grava definitivamente os efeitos dos comandos de uma transação (insert, delete e update)
Rollback Comando que desfaz os efeitos dos comandos da transação (insert, delete e update)
Fim da sessão Quando a sessão é encerrada sem problemas, ocorre um commit implícito, caso haja algum problema, ocorre um rollback implícito.
Comando DDL ou DCL Todo comando DDL (create, alter e drop) e DCL (grant e revoke) provocam o fim da transação corrente, havendo um commit implícito.

Commit - Quando o comando commit é executado, as alterações nos dados são gravadas no banco de dados.

Veja um exemplo na Listagem 1.


SQL> select matricula, nome from alunos;
  
  Matricula aluno
  ----------- -------
  
  Florentina de Jesus
  Arthur Antunes Coimbra
  Fidélio da Conceição Barreto
  
  3 rows selected.
  
  SQL> insert into alunos (matricula, nome) values (4, `Ricardo Esteves Kneipp`);
  
  1 row created.
  
  SQL> commit;
  
  Commit complete.
Listagem 1. Exemplo de commit após um insert

Após o commit, verificaremos as matriculas e nomes existentes na tabela alunos (Listagem 2).


SQL> select matricula, nome from alunos;
  
  Matricula aluno
  ----------- -------
  
  01 Florentina de Jesus
  02 Arthur Antunes Coimbra
  03 Fidélio da Conceição Barreto
  04 Ricardo Esteves Kneipp
  
  4 rows selected.
Listagem 2. Select após o commit

Façamos agora uma nova inserção, seguida de um novo select (Listagem 3).


SQL> insert into alunos (matricula, nome) values (5, `Rodney Cezar de Albuquerque`);
  
  1 row created.
  
  SQL> select matricula, nome from alunos;
  
  Matricula aluno
  ----------- -------
  
  01 Florentina de Jesus
  02 Arthur Antunes Coimbra
  03 Fidélio da Conceição Barreto
  04 Ricardo Esteves Kneipp
  05 Rodney Cezar de Albuquerque
  
  5 rows selected.
Listagem 3. Select após um insert, porém antes de um commit

É importante ressaltar que este select somente é válido para a sessão que acabou de fazer o insert. Uma outra sessão não verá as 5 linhas, uma vez que o commit não foi dado.

Rollback - Quando o comando rollback é executado, as alterações nos dados são descartadas, voltando os dados ao seu estado anterior (Listagem 4).


SQL> rollback;
  
  Rollback complete.
Listagem 4. Execução de um rollback

Verifique no exemplo da Listagem 5 que o insert feito foi desfeito.


SQL> Select matricula, nome from alunos;
  
  Matricula aluno
  ----------- -------
  
  01 Florentina de Jesus
  02 Arthur Antunes Coimbra
  03 Fidélio da Conceição Barreto
  04 Ricardo Esteves Kneipp
  
  4 rows selected.
Listagem 5. Select após um rollback

O Oracle permite que sejam definidas marcas, denominadas savepoints, a fim de possibilitar um rollback de apenas partes da transação. Essas marcas são especificadas com a utilização do comando savepoint.

Vejamos o exemplo:

Faremos à inserção do aluno Tiririca do Brejo (Listagem 6)


SQL> insert into alunos (matricula, nome) values (5, `Tiririca do Brejo`);
  
  1 row created.
Listagem 6. Inserção de um registro na tabela alunos

Savepoint
  Utilizaremos o comando savepoint para definir uma marca na transação corrente (Listagem 7).
  SQL> savepoint teste_artigo;
  
  Savepoint created.
Listagem 7. Definição de uma marca na transação

Na Listagem 8 é feito o insert de um aluno e de uma nova aluna em nossa tabela alunos.


SQL> insert into alunos (matricula, nome) values (6, `Eloir Kneipp`);
  
  1 row created.
  
  SQL> insert into alunos (matricula, nome) values (7, `Darli Esteves Kneipp`);
  
  1 row created.
Listagem 8. Duas nova inserções

Agora vamos utilizar o rollback para desfazer a transação (Listagem 9).


SQL> rollback to teste_artigo;
  
  Rollback complete.
Listagem 9. Desfazendo a transação

Verifique no exemplo da Listagem 10 que apenas o insert referente ao aluno Tiririca do Brejo foi realizado, pois o rollback desfez a transação até o último savepoint criado.


SQL> Select matricula, nome from alunos;
  
  Matricula aluno
  ----------- -------
  
  01 Florentina de Jesus
  02 Arthur Antunes Coimbra
  03 Fidélio da Conceição Barreto
  04 Ricardo Esteves Kneipp
  05 Tiririca do Brejo
Listagem 10. Desfazendo a transação até o savepoint criado

Este artigo se propôs a apresentar de forma prática a importância da gerencia de transações, através da utilização dos comandos commit, rollback e savepoint.

Confira também