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:
-
SAVEPOINT, que marca um ponto de salvação em uma transação — um ponto para o qual você pode fazer rollback posteriormente. Os pontos de salvamento são opcionais e uma transação pode ter vários deles.
-
COMMIT, que encerra a transação atual, torna suas alterações permanentes, apaga seus pontos de salvamento e libera seus bloqueios.
-
ROLLBACK, que faz ROLLBACK (desfaz) de toda a transação atual ou apenas das alterações feitas após o ponto para salvamento especificado.
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:
-
Oracle AI Database Concepts para obter mais informações sobre o gerenciamento de transações
-
Referência de Linguagem SQL do Oracle AI Database para obter mais informações sobre instruções de controle de transação
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:
-
Suas alterações são visíveis para você, mas não para outros usuários da instância do banco de Dados.
-
Suas alterações não são finais — você pode desfazê-las com uma instrução ROLLBACK.
Depois de submeter a commit uma transação:
-
Suas alterações podem ser vistas por outros usuários, e por instruções executadas após submeter a commit sua transação.
-
Suas alterações são finais — você não pode desfazê-las com uma instrução ROLLBACK.
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:
-
Finaliza a transição
-
Inverte todas as suas alterações
-
Apaga todos os pontos de salvamento
-
Libera os bloqueios das transações
Fazendo o rollback da transação atual apenas para o ponto de salvamento especificado:
-
Não finaliza a transação
-
Inverte apenas as alterações realizadas após o ponto de salvamento especificado
-
Apaga apenas os pontos de salvamento definidos após o ponto de salvamento especificado (excluindo o próprio ponto de salvamento especificado)
-
Libera todos os bloqueios de tabelas e linhas adquiridas após o ponto de salvamento especificado
Outras transações que solicitaram acesso às linhas bloqueadas após o ponto de salvamento especificado devem continuar na espera até que a transação esteja com commit ou o rollback realizados. Outras transações que não solicitaram as linhas podem pedir e acessar as linhas imediatamente.
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