Sobre Instruções DML e Transações

As instruções DML (Data Manipulation Language) adicionam, alteram e excluem dados de tabela do banco de dados. Uma transação é uma sequência de um ou mais instruções SQL que oOracle AI Database trata como uma unidade: todas as instruções são executadas ou nenhuma delas.

Sobre Instruções de Controle de Transações

Uma transação é uma sequência de um ou mais instruções SQL que oOracle AI Database trata como uma unidade: todas as instruções são executadas ou nenhuma delas. Transações são necessárias para modelar processos de negócios que exigem que diversas operações sejam executadas como uma unidade.

Por exemplo, quando um gerente sai da empresa, uma linha deve ser inserida na tabela JOB_HISTORY para mostrar quando o gerente saiu e, para cada funcionário que se reporta a esse gerente, o valor de MANAGER_ID deve ser atualizado na tabela EMPLOYEES. Para modelar esse processo em uma aplicação, você deve agrupar as instruções INSERT e UPDATE em uma única transação.

As instruções de controle de transação básicas são:

No ambiente SQL*Plus, você pode informar uma instrução do controle de transação após o prompt SQL>.

No ambiente SQL Developer, você pode inserir uma instrução do controle de transação na Planilha. O SQL Developer também tem ícones Commit Changes and Rollback Changes, explicados em "Commitindo Transações" e "Fazendo Rollback de Transações".

Cuidado:

Se você não fizer commit explícito de uma transação e o programa terminar de maneira anormal, o banco de dados fará rollback automaticamente da última transação sem commit.

A Oracle recomenda finalizar explicitamente as transações nos programas de aplicação, submetendo-as a commit ou fazendo rollback delas.

Consulte também:

Submetendo a Commit as Transações

O commit de uma transação torna suas alterações permanentes, apaga seus pontos de salvamento e libera seus bloqueios.

Para confirmar explicitamente uma transação, use a instrução COMMIT ou (no ambiente SQL Developer) o ícone Comprometer Alterações.

Observação: O Oracle AI Database emite uma declaração COMMIT implícita antes e depois de qualquer declaração DDL (Data Definition Language). Para obter informações sobre instruções DDL, consulte "Sobre Instruções de DDL (Data Definition Language)".

Antes de submeter a commit uma transação:

Depois de submeter a commit uma transação:

Exemplo 3-1 adiciona uma linha à tabela REGIONS (uma transação muito simples), verifica o resultado e, em seguida, faz commit da transação.

Exemplo 3-1 Fazendo commit de uma transação

Antes da transação:

SELECT * FROM REGIONS
ORDER BY REGION_ID;

Resultado:

 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa

4 rows selected.

Transação (adicionar linha à tabela):

INSERT INTO regions (region_id, region_name) VALUES (5, 'Africa');

Resultado:

1 row created.

Verificar se a linha foi adicionada:

SELECT * FROM REGIONS
ORDER BY REGION_ID;

Resultado:

 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa
         5 Africa

5 rows selected.

Submeter a commit a transação:

COMMIT;

Resultado:

Commit complete.

Consulte Também: Referência de Linguagem SQL do Oracle AI Database para obter informações sobre a instrução COMMIT

Transações de Rollback

A reversão de uma transação desfaz suas alterações. É possível fazer o rollback de toda a transação atual ou fazer o seu rollback apenas em um ponto de salvamento especificado.

Para reverter a transação atual somente para um ponto de salvamento especificado, você deve usar a instrução ROLLBACK com a cláusula TO SAVEPOINT.

Para fazer ROLLBACK de toda a transação atual, use a instrução ROLLBACK sem a cláusula TO SAVEPOINT ou (no ambiente do SQL Developer) o ícone ROLLBACK Changes.

Fazendo rollback de toda a transação atual:

Fazendo o rollback da transação atual apenas para o ponto de salvamento especificado:

Para ver o efeito de um rollback no SQL Developer, talvez você precise clicar no ícone Atualizar.

Como resultado do Exemplo 3-1, a tabela REGIONS tem uma região chamada "Oriente Médio e África" e uma região chamada "África". Exemplo 3-2 corrige este problema (uma transação muito simples) e verifica a alteração, mas, em seguida, faz rollback da transação e verifica o rollback.

Exemplo 3-2 Fazendo Rollback de uma Transação Inteira

Antes da transação:

SELECT * FROM REGIONS
ORDER BY REGION_ID;

Resultado:

 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa
         5 Africa

5 rows selected.

Transação (tabela de alterações):

UPDATE REGIONS
SET REGION_NAME = 'Middle East'
WHERE REGION_NAME = 'Middle East and Africa';

Resultado:

1 row updated.

Verificar a alteração:

SELECT * FROM REGIONS
ORDER BY REGION_ID;

Resultado:

 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East
         5 Africa

5 rows selected.

Fazer o rollback da transação:

ROLLBACK;

Resultado:

Rollback complete.

Verificar o rollback:

SELECT * FROM REGIONS
ORDER BY REGION_ID;

Resultado:

 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa
         5 Africa

5 rows selected.

Consulte Também: Referência de Linguagem SQL do Oracle AI Database para obter informações sobre a instrução ROLLBACK

Definindo Pontos de Salvamento em Transações

A instrução SAVEPOINT marca um ponto de salvação em uma transação, um ponto para o qual é possível fazer rollback posteriormente. Os pontos de salvamento são opcionais e uma transação pode ter vários deles. O exemplo 3-3 faz uma transação que inclui várias instruções DML e vários pontos para salvamento e, em seguida, faz rollback da transação para um ponto para salvamento, desfazendo apenas as alterações feitas após esse ponto para salvamento.

Exemplo 3-3 Fazendo Rollback de uma Transação para um Savepoint

Verifique a tabela REGIONS antes de efetuar a transação:

SELECT * FROM REGIONS
ORDER BY REGION_ID;

Resultado:

 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa
         5 Africa

5 rows selected.

Verifique os países na região 4 antes da transação:

SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 4
ORDER BY COUNTRY_NAME;

Resultado:

COUNTRY_NAME                             CO  REGION_ID
---------------------------------------- -- ----------
Egypt                                    EG          4
Israel                                   IL          4
Kuwait                                   KW          4
Nigeria                                  NG          4
Zambia                                   ZM          4
Zimbabwe                                 ZW          4

6 rows selected.

Verifique os países na região 5 antes da transação:

SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 5
ORDER BY COUNTRY_NAME;

Resultado:

no rows selected

Transação, com vários pontos de salvamento:

UPDATE REGIONS
SET REGION_NAME = 'Middle East'
WHERE REGION_NAME = 'Middle East and Africa';

UPDATE COUNTRIES
  SET REGION_ID = 5
  WHERE COUNTRY_ID = 'ZM';
SAVEPOINT zambia;

UPDATE COUNTRIES
  SET REGION_ID = 5
  WHERE COUNTRY_ID = 'NG';
SAVEPOINT nigeria;

UPDATE COUNTRIES
  SET REGION_ID = 5
  WHERE COUNTRY_ID = 'ZW';
SAVEPOINT zimbabwe;

UPDATE COUNTRIES
  SET REGION_ID = 5
  WHERE COUNTRY_ID = 'EG';
SAVEPOINT egypt;

Verifique a tabela REGIONS após a transação:

SELECT * FROM REGIONS
ORDER BY REGION_ID;

Resultado:

 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East
         5 Africa

5 rows selected.

Verifique os países na região 4 depois da transação:

SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 4
ORDER BY COUNTRY_NAME;

Resultado:

COUNTRY_NAME                             CO  REGION_ID
---------------------------------------- -- ----------
Israel                                   IL          4
Kuwait                                   KW          4

2 rows selected.

Verifique os países na região 5 depois da transação:

SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 5
ORDER BY COUNTRY_NAME;

Resultado:

COUNTRY_NAME                             CO  REGION_ID
---------------------------------------- -- ----------
Egypt                                    EG          5
Nigeria                                  NG          5
Zambia                                   ZM          5
Zimbabwe                                 ZW          5

4 rows selected.

ROLLBACK TO SAVEPOINT nigeria;

Verifique a tabela REGIONS após o rollback:

SELECT * FROM REGIONS
ORDER BY REGION_ID;

Resultado:

 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East
         5 Africa

5 rows selected.

Verifique os países na região 4 depois do rollback:

SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 4
ORDER BY COUNTRY_NAME;

Resultado:

COUNTRY_NAME                             CO  REGION_ID
---------------------------------------- -- ----------
Egypt                                    EG          4
Israel                                   IL          4
Kuwait                                   KW          4
Zimbabwe                                 ZW          4

4 rows selected.

Verifique os países na região 5 depois do rollback:

SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 5
ORDER BY COUNTRY_NAME;

Resultado:

COUNTRY_NAME                             CO  REGION_ID
---------------------------------------- -- ----------
Nigeria                                  NG          5
Zambia                                   ZM          5

2 rows selected.

Consulte Também: Referência de Linguagem SQL do Oracle AI Database para obter informações sobre a instrução SAVEPOINT