Transações
Controle de transações em SQL Uma transação é implicitamente iniciada quando ocorre uma operação que modifica o banco de dados (INSERT, UPDATE ou DELETE). Uma transação pode terminar normalmente (COMMIT) ou ser desfeita até o início da transação (ROLLBACK) ou até um ponto de controle (ROLLBACK TO SAVEPOINT).
Exemplos: Controle de transações em SQL INSERT...; DELETE...; UPDATE...; COMMIT; INSERT...; DELETE...; ROLLBACK; UPDATE...; COMMIT; INSERT...; DELETE...; SAVEPOINT sp1; UPDATE...; ROLLBACK TO sp1; DELETE...; SAVEPOINT sp2; UPDATE...; ROLLBACK TO sp2; UPDATE...; COMMIT;
Transação Uma transação é uma unidade lógica de trabalho, que faz acesso e possivelmente modifica dados. Uma transação pode ser formada por uma ou mais instruções que realizem operações sobre uma base de dados. Exemplo de transação: Transferência entre duas contas bancárias UPDATE CONTA SET SALDO = SALDO - 50.00 WHERE NUMCONTA = 100 UPDATE CONTA SET SALDO = SALDO + 50,00 WHERE NUMCONTA = 200;
Transação Começa quando for executada a primeira instrução SQL executável. Termina com um dos seguintes eventos: COMMIT ou ROLLBACK é emitida Instrução DDL é executada (commit automático) O usuário sai do SQL*Plus O sistema cai
Transação Propriedades desejáveis de transações (ACID): 1) Atomicidade: Uma transação é uma unidade indivisível, não pode ser executada parcialmente 2) Consistente: Uma transação leva o banco de um estado consistente a outro estado também consistente 3) Isolamento: Outras transações não devem enxergar alterações feitas por uma transação até que ela seja completada. 4) Durabilidade: Quando uma transação for confirmada ela deve ser permanente não podendo ser desfeita
Transação Compreendendo as propriedades O acesso ao BD é obtido por 2 operações: 1) read(x): transfere o item X do disco para um buffer na memória 2) write(x): transfere o item de dados X do buffer para o disco Exemplo de transação: Transferir R$ 50,00 de uma conta para outra Transação: Ti Contas: A e B Ti : read(a) A := A 50 write(a) read(b) B := B + 50 write(b)
Transação Onde pode falhar: Atomicidade: Falha após write(a) Consistência: A soma da contas A e B deve permanecer a mesma ao final Isolamento: O BD está inconsistente durante a transação, uma outra transação poderá ler estes dados. Ex. Soma dos saldos das contas. Durabilidade: As alterações são feitas inicialmente na memória principal, uma falha que ocorra antes da gravação em disco compromete esta propriedade
Controle de Transações O controle de transações lógicas no Oracle é feito através dos comandos COMMIT e ROLLBAK. O trabalho do banco de dados deve ser processado em agrupamentos lógicos, ou seja, o Banco de Dados deve receber alterações quaisquer mantendo-se coerente com o que o mesmo representa. A transação é um conjunto de mudanças feitas no BD entre os comandos COMMIT.
Ratifica/confirma a transação corrente fazendo todas as trocas no BD (grava fisicamente). Mudanças como INSERT, UPDATE e DELETE devem ser feitas em grupos como transações lógicas, e depois submetidas, através do comando COMMIT, ao Banco de Dados. Isto assegura a gerência e a integridade dos dados. Sintaxe: COMMIT Commit
Commit Existe a opção AUTOCOMMIT que faz com que cada mudança seja submetida após a entrada. Só deve ser usada quando as mudanças que serão feitas não estão logicamente relacionadas. Comandos que causam um COMMIT automático: ALTER, AUDIT, CREATE, DROP, EXIT, DISCONNECT, GRANT, NOAUDIT, QUIT, REVOKE.
Rollback O comando ROLLBACK cancela mudanças completadas, mas não submetidas ao BD, deixando assim o BD como se tais mudanças nunca tivessem sido feitas. Sintaxe: ROLLBACK O rollback é executado quando ocorre uma falha no sistema ou VOCÊ deseja desfazer as mudanças.
Exemplo Ao tentar remover um registro da tabela TEST, você pode acidentalmente esvaziar a tabela. Você pode corrigir o erro, emitir novamente a instrução apropriada e tornar permanentes as alterações dos dados. DELETE FROM test; 25.000 rows deleted. ROLLBACK; Rollback complete. DELETE FROM test WHERE id = 100; 1 row deleted. SELECT * FROM test WHERE id = 100; No rows selected. COMMIT; Commit complete.
Comandos Savepoint Dentro de uma transação extensa pode-se declarar pontos de salvamento (SAVEPOINT s) intermediários dividindo o trabalho na transação: INSERT... DELETE... UPDATE... SAVEPOINT PRIMEIRO INSERT... DELETE... UPDATE... SAVEPOINT SEGUNDO
Comandos Savepoint Através dos SAVEPOINT s que foi declarado pode-se desfazer partes de uma transação, deixando outras partes intactas. Exemplo: ROLLBACK TO SAVEPOINT SEGUNDO Esta instrução anula os efeitos de todas as instruções posteriores ao SAVEPOINT SEGUNDO.
Resumo Transações de Banco de Dados Começa quando for executada a primeira instrução SQL executável. Termina com um dos seguintes eventos: COMMIT ou ROLLBACK é emitida Instrução DDL ou DCL é executada (commit automático) O usuário sai do SQL*Plus O sistema cai
Controlando Transações
Estado dos dados antes de COMMIT ou ROLLBACK O Estado anterior dos dados pode ser recuperado O usuário atual pode revisar os resultados das operações DML usando a instrução SELECT. Outros usuários não poderão ver resultados das instruções DML do usuário atual. As linhas afetadas são bloqueadas, outros usuários não poderão alterar os dados dentro das linhas afetadas. Estado dos dados após COMMIT As alterações nos dados são feitas permanentemente no banco de dados. O estado anterior dos dados é perdido permanentemente. Todos os usuários podem ver os resultados. As linhas afetadas são desbloqueadas, essas linhas estão disponíveis para serem manipuladas por outros usuários. Todos os savepoints são apagados.
Exercícios
1. Crie uma tabela nomeada MY_EMPLOYEE com a seguinte estrutura. Name Null? Type ----------- -------------- ----------------- ID NOT NULL NUMBER(4) LAST_NAME FIRST_NAME USERID SALARY VARCHAR2(25) VARCHAR2(25) VARCHAR2(25) NUMBER(9,2)
2. Adicione a primeira linha de dados à tabela MY_EMPLOYEE a partir dos dados do exemplo a seguir. Não liste as colunas na cláusula INSERT. 3 Preencha a tabela MY_EMPLOYEE com duas linhas de dados de exemplo da lista anterior. Desta vez, liste as colunas explicitamente na cláusula INSERT.
4. Confirme a adição à tabela (select) 5. Torne estas transações permanentes 6. Altere o sobrenome do funcionário 3 para Drexler. 7. Altere o salário para 1000 de todos os funcionários que ganhem menos de 900. 8. Verifique as alterações na tabela. 8.1 Efetive as alterações no banco. 9. Delete Betty Dancs da tabela MAY_EMPLOYEE. 10. Faça um select para mostrar que a usuária foi removida 10.1 Desfaça a transação 10.2 - Faça um select para mostrar que a usuária está na tabela. 10.3 Delete novamente a usuária 10.4. Efetive as transações pendentes no banco. 11 Faça um select para mostrar a atual situação da tabela
12. Esvazie a tabela inteira. 13. Confirme se a tabela está vazia. 14. Execute o rollback 15. A tabela está vazia?
16. Marque um ponto intermediário no processamento da transação. 17. Esvazie a tabela inteira. 18. Confirme se a tabela está vazia. 19. Marque um ponto intermediário no processamento da transação. 20. Insira mais um registro na tabela 21. Confirme a adição à tabela. 22. Descarte a operação INSERT anterior. 23. Faça um select. A tabela está vazia? 24. Descarte a operação DELETE. 25. Faça um select. A tabela está vazia?