Baixe o app para aproveitar ainda mais
Prévia do material em texto
Transações - Unidade lógica de trabalho (processamento), formada por um conjunto de comandos SQL (DML), que tem por objetivo preservar a integridade e a consistência dos dados. - Ao final de uma transação, ou se tem todos os seus dados íntegros e consistentes no banco ou eles retornam ao estado anterior ao início da transação (ou se tem os dados consistentes ou não se tem nada). - Conjunto de várias solicitações do usuário - Tratada pelo SGBD como uma sequência de ações no BD (leituras/gravações). - Uma transação pode conter uma ou múltiplas operações (insert/delete/update). Propriedades das Transações (ACID) - Atomicidade: Propriedade do tudo-ou-nada. Ou a transação inteira é executada com sucesso ou nenhuma de suas ações é executada. - Consistência: A transação não viola a consistência (estrutura) da base de dados - Isolamento: Transações concorrentes não interferem umas com as outras. As modificações que uma transação faz no banco de dados somente são visíveis para o usuário que a está executando. Somente no seu encerramento é que as modificações (todas) passam a ser vistas por outros usuários. - Durabilidade: Uma vez que a transação completa seu trabalho, seus efeitos têm garantia de serem refletidos no banco de dados. Exemplo 1 Considere um sistema bancário simplificado e a execução das transações T1 e T2 conforme o quadro abaixo Se em (1) a consulta do saldo da Conta X resultar 1.000, pode-se afirmar que: a) Em (3) a Consulta de Saldo resultará 1.500 b) Em (3) a Consulta de Saldo resultará 1.000 c) Em (3) a Consulta de Saldo resultará 500 d) Em (3) a Transação 2 entrará em espera da conclusão da Transação 1 e) Em (5) a Consulta de Saldo resultará 500 Resp b): Nos momentos (1), (2) e (3), em que a transação T1 está sendo executada, a transação T2 não tem acesso ao que a transação T1 está modificando (isolamento) e tem acesso de consulta aos dados conforme estavam antes do início de T1. Assim, em (3) a consulta de saldo será 1.000. Em (5) a transação T1 já estará encerrada e a consulta de saldo resultará 1.500. Exemplo 2 Uma operação cuja finalidade é transferir uma quantia de R$100 da conta 123 para a conta 456 - Operação indivisível – “transferir dinheiro de uma conta para outra” – Estão envolvidas duas operações (atualizações) separadas no banco de dados. UPDATE CONTAS SET SALDO = SALDO – 100 WHERE CONTA = 123; UPDATE CONTAS SET SALDO = SALDO + 100 WHERE CONTA = 456; OBJETIVO: Se o primeiro comando falhar, o segundo não poderá ser executado; Se o segundo falhar, o primeiro não poderá ser confirmado (será “desfeito”) CONCLUSÃO: • Se uma transação for concluída com sucesso, as alterações por ela realizadas serão confirmadas e não poderão ser desfeitas. • Se uma transação é concluída com fracasso, o SGBD deve desfazer todas as operações de atualização de dados contidas na transação em questão. EXEMPLO DE LABORATÓRIO: CREATE DATABASE TRANSACAO GO USE TRANSACAO GO CREATE TABLE TBCONTA ( CODIGO INT NOT NULL IDENTITY PRIMARY KEY, CONTA INT NOT NULL, SALDO SMALLMONEY NOT NULL, LIMITE SMALLMONEY NOT NULL); --teste 1 BEGIN TRANSACTION INSERT INTO TBCONTA (CONTA,SALDO,LIMITE) VALUES (123,5000,10000) INSERT INTO TBCONTA (CONTA,SALDO,LIMITE) VALUES (456,200,NULL) --erro IF @@ERROR<>0 ROLLBACK ELSE COMMIT SELECT * FROM TBCONTA --teste 2 BEGIN TRANSACTION INSERT INTO TBCONTA (CONTA,SALDO,LIMITE) VALUES (123,5000,10000) INSERT INTO TBCONTA (CONTA,SALDO,LIMITE) VALUES (456,200,400) IF @@ERROR<>0 ROLLBACK ELSE COMMIT SELECT * FROM TBCONTA --teste 3 BEGIN TRANSACTION UPDATE TBCONTA SET SALDO = SALDO - 1000 WHERE CONTA=123 UPDATE TBCONTA SET SALDO = SALDO + 100000000000 WHERE CONTA=456 --erro IF @@ERROR<>0 ROLLBACK ELSE COMMIT SELECT * FROM TBCONTA --teste 4 BEGIN TRANSACTION INSERT INTO TBCONTA (CONTA,SALDO,LIMITE) VALUES (789,5000,10000) INSERT INTO TBCONTA (CONTA,SALDO,LIMITE) VALUES (111,200,400) UPDATE TBCONTA SET SALDO = SALDO - 1000 WHERE CONTA=789 UPDATE TBCONTA SET SALDO = SALDO + 100000000000 WHERE CONTA=111 --erro IF @@ERROR<>0 ROLLBACK ELSE COMMIT SELECT * FROM TBCONTA --teste 5 BEGIN TRANSACTION UPDATE TBCONTA SET SALDO = SALDO + 100000000000 WHERE CONTA=456 --erro UPDATE TBCONTA SET SALDO = SALDO - 1000 WHERE CONTA=123 IF @@ERROR<>0 ROLLBACK ELSE COMMIT SELECT * FROM TBCONTA --teste 6 BEGIN TRY BEGIN TRANSACTION UPDATE TBCONTA SET SALDO = SALDO + 100000000000 WHERE CONTA=456 --erro UPDATE TBCONTA SET SALDO = SALDO - 1000 WHERE CONTA=123 PRINT 'TRANSAÇÃO OK' COMMIT TRANSACTION END TRY BEGIN CATCH PRINT 'ERRO NA TRANSAÇÃO' ROLLBACK TRANSACTION END CATCH SELECT * FROM TBCONTA --teste 7 BEGIN TRY BEGIN TRANSACTION UPDATE TBCONTA SET SALDO = SALDO + 1000 WHERE CONTA=456 UPDATE TBCONTA SET SALDO = SALDO - 1000 WHERE CONTA=123 PRINT 'TRANSAÇÃO OK' COMMIT TRANSACTION END TRY BEGIN CATCH PRINT 'ERRO NA TRANSAÇÃO' ROLLBACK TRANSACTION END CATCH SELECT * FROM TBCONTA --teste 8 BEGIN TRY BEGIN TRANSACTION UPDATE TBCONTA SET SALDO = SALDO + 1000 WHERE CONTA=456 INSERT INTO TBCONTA (CONTA,SALDO,LIMITE) VALUES (NULL,5000,10000) --erro UPDATE TBCONTA SET SALDO = SALDO - 1000 WHERE CONTA=123 PRINT 'TRANSAÇÃO OK' COMMIT TRANSACTION END TRY BEGIN CATCH PRINT 'ERRO NA TRANSAÇÃO' ROLLBACK TRANSACTION END CATCH SELECT * FROM TBCONTA
Compartilhar