Transações, como utilizar?

Olá,

Aproveitando o embalo do estudos para a prova 70-433, vou falar um pouco de transações e como utilizar o comando SAVE TRANSACTION, que pode ser bem útil em alguns cenários.

As transações podem ser definidas como um meio para garantir que um conjunto de ações (ou uma ação individual) tenha sucesso ou falhe por completo, de forma a garantir as características ACID do banco de dados. No SQL Server existem transações implícitas e explícitas e por padrão o SQL Server trabalha com transações implícitas. O que significa isso? Cada statement executada na base de dados é considerado como uma transação individual, sendo sua execução “commitada” ao terminar.

Para termos maior controle sobre o que estamos executando nós trabalharemos com transações explícitas, utilizando seguintes comandos:

  • BEGIN TRANSACTION
  • COMMIT TRANSACTION
  • ROLLBACK TRANSACTION

Um exemplo:

BEGIN TRANSACTION

insert into t1 values (1, ‘Text1’);

COMMIT TRANSACTION

Na sequência vou executar um script com transações alinhadas, ou seja, vamos trabalhar com mais de uma transação por vez:

 

— Início da transação 1

begin tran

 

— Inserindo alguns valores…

insert into t1 values (1, ‘Text1’);

insert into t1 values (2, ‘Text2’);

insert into t1 values (3, ‘Text3’);

 

— Verificando os dados inseridos

select * from t1;

 

— Início da transação 2

begin tran

 

— Vou realizar um update pra demonstrar o resultado.

update t1

set col2 = ‘nonononono’

where col1 = 2;

 

— Só pra confirmar…

select * from t1;

 

— Aplicar o COMMIT. Este commit será feito somente para a Transação 2.

commit

 

— Validando quantas transação ainda temos abertas. Temos de ter pelo menos uma.

select @@trancount

 

— Fazendo um rollback para depois ver qual resultado vou obter…

rollback;

select * from t1;

 

Executem passo a passo e acompanhem os resultados. Foi aberta uma transação e foram inseridos alguns registros na tabela de testes. Depois abrimos uma nova transação e atualizamos um registro desta tabela. O commit confirma o update realizado mas na sequência, perto do término do script é feito um rollback. Façam novamente um select na tabela para ver qual será o resultado.

Tudo foi desfeito!!!

Porque isto acontece? Não importa quantas transações sejam abertas numa sessão, se for realizado um rollback, todas as transações serão desfeitas. Mesmo aquelas que foram commitadas, lembrando que isto vale somente para transações da mesma seção. Apesar de ter sido feito o commit de uma das transações, ainda havia uma transação aberta, que era externa a transação que foi “commitada”, logo, com o rollback tudo foi desfeito.

Podemos evitar este problema utilizando o comando SAVE TRANSACTION.

O script abaixo executa o mesmo que o acima mas agora com a inclusão de um SAVE TRANSACTION para garantir que uma parte da execução seja realmente salva. Vejam:

 

begin tran

 

insert into t1 values (1, ‘Text1’);

insert into t1 values (2, ‘Text2’);

insert into t1 values (3, ‘Text3’);

 

select * from t1;

 

— Aqui o “x” da questão.

save tran step1;

 

begin tran

select @@trancount

 

update t1

set col2 = ‘nonononono’

where col1 = 2;

 

select * from t1;

 

commit

select @@trancount

 

— Neste ponto eu vou fazer rollback somente para o ponto que eu criei…

rollback tran step1;

 

— Confirmando que voltei ao ponto salvo antes de fazer o update.

select * from t1;

 

— Ainda tenho uma transação aberta …

select @@trancount

 

— Fazendo o último commit e validando o resultado.

commit

select * from t1;

 

Uma observação: Reparem que a utilização do comando SAVE TRANSACTION implica em se nomear a transação salva. O mesmo vale na hora de fazer o commit/rollback.

Já vi casos onde o desenvolvedor teve dificuldades de trabalhar um determinado processo pois haviam diversas transações sendo trabalhadas e quando ocorria um erro que não era tratado e era feito um rollback, tudo o que ele havia feito era perdido. Com a utilização do comando SAVE TRANSACTION você pode aumentar a forma de como você controla o seu processo e manter o controle sobre o que está sendo executado.

Espero que seja útil.

 

Até a próxima!

Erickson Ricci

 

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s