Buscar

Transações em Bancos de Dados

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

Continue navegando