Skip Navigation Links
Novas Tecnologias
Ferramentas Adicionais
Ferramentas Adicionais


Dica No :
575
Assunto : SQL Server
Titulo: Fazendo rollback em transações aninhadas

Gostou do texto ? Vote e dê sua opinião! Pontuação atual :

Translate this page now :






Adicione aos Favoritos!
BlogBlogs Rec6 Linkk Ueba Technorati Delicious DiggIt! StumbleUpon



Imagine a execução de duas procedures, uma chamando a outra. Imagine que nestas duas temos uma transação em cada, isso porque tendo as duas (A e B) e A chamando B, não sabemos se sempre será utilizada a procedure A ou se haverão casos de uso da procedure B.

Então neste caso certamente pensaremos no seguinte código (simplifiquei para exemplo):

Create procedure proc1 As
Begin transaction
insert into teste values (10)
exec proc2
if @@error<>0
begin
rollback transaction
end
else
commit transaction
go

Create procedure proc2 as

Begin transaction

insert into teste values(20)
if @@error<>0
rollback transaction
else
commit transaction

GO

O problema é que este código não irá funcionar. O motivo é simples : Apesar do commit transaction funcionar corretamente com transações aninhadas, o rollback transaction tem um comportamento inesperado. O Rollback Transaction faz o Rollback de todas as transações, não apenas da transação mais interna e isso gerará vários problemas no código.

Para solucionar este problema de forma agradável precisaremos fazer um pequeno IF dentro da 2a procedure : Testando se uma transação já existe ou não podemos optar por fazer um begin transaction ou apenas fazer um save point na transação. Fazendo um save point temos opção de fazer rollback até este ponto sem afetar diretamente a transação principal.

Veja como fica :


alter procedure proc2 as
if @@trancount=0
Begin transaction tran2 with mark
else
save transaction tran2

insert into teste values(20)
if @@error<>0
rollback transaction tran2
else
commit transaction tran2


Apenas para efeito de teste você pode experimentar gerar um erro para ver como funciona :


alter procedure proc2 as
if @@trancount=0
Begin transaction tran2 with mark
else
save transaction tran2

insert into teste values(20)
raiserror('deu erro',11,1)
rollback transaction tran2


Nome :
E-mail:
Comentarios :
 
 
Os Últimos Comentários
data: 11/27/2017 9:07:00 PM
nome: CxdtYDQXSlFlFhbqQn
email: jimosanil0c@hotmail.com
comentário:
81gxa3 http://www.LnAJ7K8QSpfMO2wQ8gO.com

 1  
Dicas
Dica do Dia
Receba Dicas Por Email
E-mail :  
 


 (help)
Aceito receber informativos do devASPNet, informações de eventos e treinamentos

Veja Quais Informativos Você Receberá

Pesquisar Dicas
Pesquisar Artigos, Dicas e Noticias

Banco de Dados
Algumas Entrevistas
Links Importantes

Búfalo Informática, Treinamento e Consultoria
R. Alvaro Alvim, 37/920 Centro - Cinelândia - Rio de Janeiro Cep: 20031-010
Tel : (21) 2262-1368 (21) 9240-5134 E-mail : Contato@bufaloinfo.com.br