Usuário com melhor resposta
Dúvida: Transação com múltiplas procedures

Pergunta
-
Olá Pessoal,
Bem estou com dúvida quanto ao uso do Begin Transation, RollBack e Commit.
Eu leio na internet sobre seu uso, assim como suas facilidades, entretanto isso não está sendo tão simples assim para mim.
Eu preciso realizar 3 operações e apenas concluir se todas as operações forem executadas com sucesso, caso contrário tudo volta ao normal.
Sendo assim eu criei 4 procedures:
· InsereTabela
· AtualizaMovimento
· CriaConta
· IniciaTransacao
Justamente na última procedure eu inicio a execução das 3 dessas operações:
create procedure InciaTransacao Begin transaction exec InsereTabela exec AtualizaMovimento exec CriaConta if @@Error <> 0 rollback else commit transaction
Isso está correto?
Quando ocorre um erro nada é modificado, o que teoricamente seria o correto. Mas o estranho, é que quando ocorre o erro tanto um print ou select que eu coloco antes @@ERROR ou rollback não é executado.
Vocês poderiam também avaliar se a estrutura que eu montei também está correta?E finalmente, nas tabelas eu tenho primary key com identity(1,1), mesmo com o rollback o valor do id não deveria voltar?
Obrigado.
- Editado matt_nab quarta-feira, 13 de maio de 2009 17:25
Respostas
-
Ola matt.
exato o SQL 2000 aborta e reverte a transacao.
OBS.
sinceramente acho que nao tem outro modo p/ tratamento erro no level de batch ao ser ser o DBA ou analista visualisar o erro executando no Query Anbalyzer, mas nunca testei na aplicacao nao sei se um ON ERROR na aplicacao vai tratar....
att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!- Marcado como Resposta matt_nab quinta-feira, 14 de maio de 2009 11:27
-
Ola matt.
exato o SQL 2000 aborta e reverte a transacao.
OBS.
sinceramente acho que nao tem outro modo p/ tratamento erro no level de batch ao ser ser o DBA ou analista visualisar o erro executando no Query Anbalyzer, mas nunca testei na aplicacao nao sei se um ON ERROR na aplicacao vai tratar....
att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
Olá Marcelo,
Realmente muito obrigado pela explicação! Ótimo que o mesmo faça o rollback automático, pois essa era a minha principal preocupação.
Bem, só tenho a agradecer a você e todos que ajudaram. Essa comunidade é excelente!
Obrigado,
Matheus.- Marcado como Resposta matt_nab quinta-feira, 14 de maio de 2009 11:27
Todas as Respostas
-
Olá,
Qual o seu SQL Server?
Dentro das procedures
exec InsereTabela
existe algum commit? Se os códigos das procedures possuim dependência o ideal seria realizar tudo na mesma procedure.
exec AtualizaMovimento
exec CriaConta
Só para adiantar, os identitys não voltam quando acontece um erro.
Abraços
Demétrio Silva -
-
-
-
Ola Matt,
Da maneira que vc esta fazendo pode da certo sim, voce só precisa ficar atento na hora de verificar se houve erro
create procedure InciaTransacao Begin transaction exec InsereTabela if @@error<> 0 goto trataerro exec AtualizaMovimento if @@error<> 0 goto trataerro exec CriaConta if @@error<> 0 goto trataerro commit transaction trataerro: print 'erro...' rollback
att.Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!! -
-
-
-
-
Demétrio,
Olha só que interessante, seu exemplo funcionou mas olha nesse caso:
create procedure b as begin set nocount on select cast('a' as int) end go create procedure a as begin begin transaction exec b print 'ok' if @@error <> 0 rollback else commit transaction end go exec a
Ai não ocorre o Print.
-
-
-
-
-
-
-
-
Demétrio, você viu que alterando aquele seu exemplo para um erro de tipos de dados, o PRINT não executa?
create procedure b as begin set nocount on select cast('a' as int) end go create procedure a as begin begin transaction exec b print 'ok' if @@error <> 0 rollback else commit transaction end go exec a
-
-
Ola Matt,
Então existe um ppt muito bom sobre tratamento de erros do PASS vou localizar e te passo.
mas olha este teste de erro de BATCH LEVEL
CREATE PROCEDURE DemoSemErro AS SELECT 'Nao existe erro aqui' go CREATE PROCEDURE DemoBatchAbort AS DECLARE @Err as INT SELECT 'Primeiro select' declare @Param int exec DemoSemErro @Param SET @Err = @@Error SELECT 'Segunto select' IF @Err <> 0 RETURN @Err go -- executa os testes declare @Ret int exec @Ret = DemoBatchAbort select @@Error select @Ret
O sql vai abortar e nao vai exibir o @@error e nem o @ret (isto nao acontece mais no 2005) o sql 2000 aborta naquele ponto...
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!! -
Matt,
Realmente:
SELECT 1/0 IF @@ERROR <> 0 BEGIN PRINT 'ERRO 1/0' END ELSE BEGIN PRINT 'OK' END GO SELECT CAST('A' AS INT) IF @@ERROR <> 0 BEGIN PRINT 'ERRO CAST A INT' END ELSE BEGIN PRINT 'OK' END
Não sei te explicar porque um aparece e outro não. Até o level do erro é o mesmo.
Vamos esperar para ver se alguem do fórum explica.
Abraços
Demétrio Silva -
Olá Marcelo!
Entendi o seu exemplo, mas uma curiosidade, como estou usando o SQL2000, o processo está sendo abortado.
Mas o que acontece com um processo abortado dentro de um BEGIN TRANSACTION?
UM ROLLBACK AUTOMATICO!?
Por quê pra mim, parece que ocorre o ROLLBACK por que os Insert's na tabela são apagados.
Abraços. -
Matt,
Pois é Demétrio,
Realmente:
SELECT 1/0 IF @@ERROR <> 0 BEGIN PRINT 'ERRO 1/0' END ELSE BEGIN PRINT 'OK' END GO SELECT CAST('A' AS INT) IF @@ERROR <> 0 BEGIN PRINT 'ERRO CAST A INT' END ELSE BEGIN PRINT 'OK' END
Não sei te explicar porque um aparece e outro não. Até o level do erro é o mesmo.
Vamos esperar para ver se alguem do fórum explica.
Abraços
Demétrio Silva
Isso é muito estranho. Até agora só percebi isso em Erros de Tipos de Dados. -
Ola matt.
exato o SQL 2000 aborta e reverte a transacao.
OBS.
sinceramente acho que nao tem outro modo p/ tratamento erro no level de batch ao ser ser o DBA ou analista visualisar o erro executando no Query Anbalyzer, mas nunca testei na aplicacao nao sei se um ON ERROR na aplicacao vai tratar....
att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!- Marcado como Resposta matt_nab quinta-feira, 14 de maio de 2009 11:27
-
Matt
este erro nao acontece no tipo de dados, no meu exemplo acima enviei um parametro que nao existia e aconteu o erro..
OBS. Como ja disse isto nao ocorre no 2005. (exibe o erro mas nao aborta)
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!! -
Matt
este erro nao acontece no tipo de dados, no meu exemplo acima enviei um parametro que nao existia e aconteu o erro..
OBS. Como ja disse isto nao ocorre no 2005. (exibe o erro mas nao aborta)
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
Sim eu entendi o seu exemplo, mas o Tipo de dados pelo qual me referi era na minha procedure. :) -
Ola matt.
exato o SQL 2000 aborta e reverte a transacao.
OBS.
sinceramente acho que nao tem outro modo p/ tratamento erro no level de batch ao ser ser o DBA ou analista visualisar o erro executando no Query Anbalyzer, mas nunca testei na aplicacao nao sei se um ON ERROR na aplicacao vai tratar....
att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
Olá Marcelo,
Realmente muito obrigado pela explicação! Ótimo que o mesmo faça o rollback automático, pois essa era a minha principal preocupação.
Bem, só tenho a agradecer a você e todos que ajudaram. Essa comunidade é excelente!
Obrigado,
Matheus.- Marcado como Resposta matt_nab quinta-feira, 14 de maio de 2009 11:27
-