26

Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: [email protected] Fone: 9531-7555 [email protected]

Embed Size (px)

Citation preview

Page 1: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com
Page 2: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

Administração de Banco de DadosAdministração de Banco de Dados1º Semestre – 20111º Semestre – 2011

Pedro Antonio Galvão JuniorPedro Antonio Galvão JuniorE-mail: [email protected] Fone: 9531-7555E-mail: [email protected] Fone: 9531-7555

Versão 1.11.04 – Abril/2011.Versão 1.11.04 – Abril/2011.

Sistemas de InformaçãoSistemas de InformaçãoRedes de ComputadoresRedes de Computadores

Análise e Desenvolvimento de SistemasAnálise e Desenvolvimento de Sistemas

Page 3: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

TRABALHANDO COM TRABALHANDO COM

TRANSAÇÕES NO SQL SERVERTRANSAÇÕES NO SQL SERVER

Page 4: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

INTRODUÇÃOINTRODUÇÃO• Em ambientes multi-usuários, existem operações que precisam ser serializadas,

ou seja, colocadas em fila para que sejam executadas "uma a uma", não

permitindo tarefas em paralelo.

• Essas operações são amparadas por um conceito muito forte em bancos de

dados relacionais denominado Transação, cujo objetivo é agrupar uma

sequência de comandos que precisam ser tratados como um bloco único e

invisível, para que se mantenham a integridade e a consistência dos dados.

Page 5: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

INTRODUÇÃOINTRODUÇÃO

• O SQL Server fornece três maneiras de tratar transações, que

podemos definir dentro de uma conexão. Essas três maneiras são:

– Transações de autoconfirmação;

– Transações explícitas; e

– Transações implícitas.

Page 6: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

TRANSAÇÕES DE TRANSAÇÕES DE AUTOCONFIRMAÇÃOAUTOCONFIRMAÇÃO

• O modo de confirmação automática é o modo padrão de gerenciamento de

transações do Mecanismo de banco de dados do SQL Server.

• Toda instrução Transact-SQL é confirmada ou revertida quando concluída. Se

uma instrução for concluída com sucesso, será confirmada; se encontrar

qualquer erro, será revertida.

• Uma conexão para uma instância do Mecanismo de Banco de Dados opera em

modo de confirmação automática sempre que esse modo padrão não for

substituído por transações explícitas ou implícitas.

Page 7: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

TRANSAÇÕES DE TRANSAÇÕES DE AUTOCONFIRMAÇÃOAUTOCONFIRMAÇÃO

• O modo de confirmação automática também é o modo padrão para ADO, OLE DB, ODBC e

DB-Library.

• Uma conexão a uma instância do Mecanismo de Banco de Dados opera em modo de

confirmação automática até que uma instrução BEGIN TRANSACTION inicie uma

transação explícita, ou que uma transação implícita seja definida como ativada.

• Quando a transação explícita é confirmada ou revertida, ou quando o modo de transação

implícito é desativado, a conexão retorna ao modo de confirmação automática.

Page 8: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

TRANSAÇÕES DE TRANSAÇÕES DE AUTOCONFIRMAÇÃOAUTOCONFIRMAÇÃO

• Quando ON, SET IMPLICIT_TRANSACTIONS define a conexão como modo de transação

implícita.

• Quando OFF, ele retorna a conexão para o modo de transação de confirmação

automática.

• No modo de confirmação automática, às vezes parece que uma instância do Mecanismo

de Banco de Dados reverteu um lote inteiro, em vez de apenas uma instrução SQL. Isto

acontece se o erro encontrado for um erro de compilação, não um erro em tempo de

execução.

Page 9: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

TRANSAÇÕES DE TRANSAÇÕES DE AUTOCONFIRMAÇÃOAUTOCONFIRMAÇÃO

• Um erro de compilação impede o Mecanismo de Banco de Dados de criar um

plano de execução, assim nada no lote é executado.

• Embora pareça que todas as instruções antes daquela que gerou o erro tenham

sido revertidas, o erro impediu que tudo no lote fosse executado.

Page 10: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

PRÁTICA 1 - TRANSAÇÕES DE PRÁTICA 1 - TRANSAÇÕES DE AUTOCONFIRMAÇÃOAUTOCONFIRMAÇÃO

• Para ilustrar e demonstrar como o SQL Server trabalha com Transações de

AutoConfirmação, vamos realizar a Prática 1. Em um banco de dados qualquer, crie a

seguinte tabela:

CREATE TABLE OBJETO

(

ID INT NOT NULL PRIMARY KEY,

COLUNA1 VARCHAR(20) NOT NULL,

COLUNA2 VARCHAR(20) NULL

);

Page 11: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

PRÁTICA 1 - TRANSAÇÕES DE PRÁTICA 1 - TRANSAÇÕES DE AUTOCONFIRMAÇÃOAUTOCONFIRMAÇÃO

• Com a tabela criada, vamos às transações, realizandos os 3 inserts abaixo:

– INSERT INTO OBJETO VALUES (1, 'Primeira coluna', 'Primeira coluna');

– INSERT INTO OBJETO VALUES (2, null, 'Segunda coluna');

– INSERT INTO OBJETO VALUES (3, 'Terceira coluna', 'Terceira coluna');

• Após a execução, recebemos a seguinte mensagem:

Page 12: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

PRÁTICA 1 - TRANSAÇÕES DE PRÁTICA 1 - TRANSAÇÕES DE AUTOCONFIRMAÇÃOAUTOCONFIRMAÇÃO

• A mensagem é apresentada porque a COLUNA1 da tabela OBJETO não aceita valor NULL.

• Agora vamos executar um SELECT simples na tabela OBJETO. Poderemos verificar que os

inserts 1 e 3 foram executados.

• Isso significa que quando o SQL Server usa transações de autoconfirmação, cada instrução

é uma transação por si só.

• Quando uma instrução produz um erro (como no insert 2), automaticamente a instrução é

revertida, senão ela é confirmada.

Page 13: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

TRANSAÇÕES EXPLÍCITASTRANSAÇÕES EXPLÍCITAS• Uma transação explícita é aquela para a qual você define o início e término da transação

explicitamente. O modo de transação explícito permanece apenas no período de duração

da transação.

• Quando a transação terminar, a conexão volta ao modo de transação em que estava antes

de a transação explícita ser iniciada, implícito ou modo de confirmação automática.

• Os aplicativos DB-Library e scripts Transact-SQL usam as instruções BEGIN TRANSACTION,

COMMIT TRANSACTION, COMMIT WORK, ROLLBACK TRANSACTION ou ROLLBACK

WORK Transact-SQL para definir transações explícitas. BEGIN TRANSACTION marca o

ponto inicial de uma transação explícita para uma conexão.

Page 14: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

TRANSAÇÕES EXPLÍCITASTRANSAÇÕES EXPLÍCITAS• COMMIT TRANSACTION ou COMMIT WORK são usadas para encerrar uma transação com

êxito se nenhum erro for encontrado.

• ROLLBACK TRANSACTION ou ROLLBACK WORK são usados para apagar uma transação na

qual são encontrados erros.

• Todos os dados modificados pela transação retornam ao estado em que estavam no início

da transação. Os recursos mantidos pela transação são liberados.

Page 15: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

TRANSAÇÕES EXPLÍCITASTRANSAÇÕES EXPLÍCITAS• Nesse tipo, o desenvolvedor define onde a transação é inicializada e onde ela é finalizada

ou revertida.

• Para isso, utilizaremos as seguintes instruções:

– Begin Transaction: para iniciar uma transação;

– Commit Transaction: para confirmar uma transação;

– Rollback Transaction: para reverter uma transação.

• A palavra TRANSACTION pode ser abreviada para TRAN.

Page 16: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

PRÁTICA 2 - TRANSAÇÕES PRÁTICA 2 - TRANSAÇÕES EXPLÍCITASEXPLÍCITAS

• Vamos utilizar o código da seguinte forma:

BEGIN TRAN

INSERT INTO OBJETO VALUES (1, 'Primeira coluna', 'Primeira coluna');

INSERT INTO OBJETO VALUES (2, null, 'Segunda coluna');

INSERT INTO OBJETO VALUES (3, 'Terceira coluna', 'Terceira coluna');

COMMIT TRAN

Page 17: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

PRÁTICA 2 - TRANSAÇÕES PRÁTICA 2 - TRANSAÇÕES EXPLÍCITASEXPLÍCITAS

• Vamos executar o código, e o que acontece?

• Você irá receber a mesma mensagem de erro do exemplo anterior e, ao executar

uma consulta na tabela OBJETO, irá obter o mesmo resultado.

• Então, o que mudou?

• Lembre-se: é responsabilidade do desenvolver determinar se a transação deve

ser revertida. No exemplo acima, não fizemos nenhum tratamento para que a

instrução fosse revertida no caso de algum erro.

Page 18: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

PRÁTICA 2 - TRANSAÇÕES PRÁTICA 2 - TRANSAÇÕES EXPLÍCITASEXPLÍCITAS

• Melhorando nossa rotina:

– Exclua todos os registro da tabela OBJETO utilizando o comando Truncate Table

OBJETO. Vamos alterar nosso exemplo conforme o arquivo em anexo:

– Exemplo - Trabalhando com Transações Explícitas.sql

• Nesse exemplo estamos utilizando a rotina de tratamento de erro TRY e CATCH. Execute a

rotina acima e veja que nenhum registro será incluído na tabela OBJETO, ou seja, a

reversão da instrução foi executada com sucesso.

• Para melhorar nosso tratamento de erro, adicionei ao CATCH uma consulta que traga

mais informações sobre o erro e uma mensagem de erro.

Page 19: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

TRANSAÇÕES IMPLÍCITASTRANSAÇÕES IMPLÍCITAS• Quando uma conexão operar em modo de transação implícita, a instância do

Mecanismo de banco de dados do SQL Server iniciará automaticamente uma

nova transação depois que a transação atual for confirmada ou revertida.

• Você não faz nada para determinar o início de uma transação; apenas confirma

ou reverte cada uma das transações.

• O modo de transação implícita gera uma cadeia contínua de transações.

Page 20: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

TRANSAÇÕES IMPLÍCITASTRANSAÇÕES IMPLÍCITAS• Após a configuração do modo de transação implícita em uma conexão, a

instância do Mecanismo de Banco de Dados iniciará automaticamente a

transação ao executar pela primeira vez cada uma destas instruções:

ALTER TABLE INSERT

CREATE OPEN

DELETE REVOKE

DROP SELECT

FETCH TRUNCATE TABLE

GRANT UPDATE

Page 21: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

TRANSAÇÕES IMPLÍCITASTRANSAÇÕES IMPLÍCITAS

• A transação permanecerá em vigor até que você emita uma instrução COMMIT ou

ROLLBACK.

• Após a confirmação ou reversão da primeira transação, a instância do Mecanismo de

Banco de Dados iniciará automaticamente uma nova transação da próxima vez que

qualquer instrução for executada pela conexão.

• A instância continuará a gerar a cadeia de transações implícitas até que modo de

transação implícita seja desativado.

• O modo de transação implícita é definido tanto pelo uso da instrução SET do Transact-SQL O modo de transação implícita é definido tanto pelo uso da instrução SET do Transact-SQL

como por meio de funções e métodos API de banco de dados.como por meio de funções e métodos API de banco de dados.

Page 22: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

PRÁTICA 3 - TRANSAÇÕES PRÁTICA 3 - TRANSAÇÕES IMPLÍCITASIMPLÍCITAS

• Observação: O modo de transação implícita no SQL Server inicia uma transação se

nenhuma já tiver sido inicializada, mas o COMMIT ou o ROLLBACK deve ser definido pelo

desenvolvedor.

• Para usar esse tipo de transação, precisamos ativá-la no SQL Server usando o código

abaixo:

– SET IMPLICIT_TRANSACTIONS ON;

• Agora execute a instrução abaixo para verificar quantas transações em aberto existem:

– SELECT @@TRANCOUNT;

Page 23: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

PRÁTICA 3 - TRANSAÇÕES PRÁTICA 3 - TRANSAÇÕES IMPLÍCITASIMPLÍCITAS

• Crie uma tabela simples e execute o @@TRANCOUNT novamente:

– CREATE TABLE TESTE (ID INT PRIMARY KEY);

– SELECT @@TRANCOUNT;

• O resultado agora é 1, uma transação foi inicializada. E se executarmos um insert simples

nessa tabela?

– INSERT INTO TESTE VALUES (10);

– SELECT * FROM TESTE; SELECT @@TRANCOUNT;

Page 24: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

PRÁTICA 3 - TRANSAÇÕES PRÁTICA 3 - TRANSAÇÕES IMPLÍCITASIMPLÍCITAS

• A instrução insert foi executada, porém continuamos a ter uma única transação. Para

finalizar, vamos executar um ROLLBACK:

– ROLLBACK TRAN;

– SELECT @@TRANCOUNT;

• Pronto, nossa transação foi revertida. Se você quiser confirmar, execute um SELECT na

tabela TESTE. O que aconteceu?

• Uma mensagem de erro informando que a tabela não existe é exibida, ou seja, nosso

ROLLBACK reverteu tudo, desde o insert à criação da tabela.

Page 25: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com

PRÁTICA 3 - TRANSAÇÕES PRÁTICA 3 - TRANSAÇÕES IMPLÍCITASIMPLÍCITAS

• Para finalizar, vamos desativar as transações implícitas:

– SET IMPLICIT_TRANSACTIONS OFF;

Page 26: Administração de Banco de Dados 1º Semestre – 2011 Pedro Antonio Galvão Junior E-mail: pedrogalvaojunior@gmail.com Fone: 9531-7555 pedrogalvaojunior@gmail.com