locked
Rollback&Commit RRS feed

  • Pergunta

  • boa noite
    
    estou tentando fazer uma SP que deve fazer um update conforme os parametros 
    enviados, e gostaria de controlar a  transação, mas a impressao que da é que 
    mesmo que eu force um erro de valor da chave primaria a SP não faz o 
    rollback, segue abaixo o script:
    
    create procedure sp_update
       @tempo int, @nome char(10), @chave int
    as
       begin transaction
          update teste 
             set PendDados=@tempo, TTempoNJustif=@nome
             where cod_teste =  @chave
    if @@error <>0
        begin
           rollback transaction
           print 'Falhou'
       end
    else
       begin
           commit transaction
           print 'Gravou'
       end
    
    porque o SQL não retorna erro?
    
    Ats.
    Wellington L. da Silva
    domingo, 8 de outubro de 2006 20:33

Respostas

  • e que na verdade nao falhou, apenas nao atualizou ou seja nao existe o erro, para tratar o erro se for atualizado use:

     

      Declare @LinhasAtt int

     

      depois do update

     

      Select @LinhasAtt = @@rowcount

     

      entao teste o valor de @LinhasAtt se ele for > 0 ele atualizou linhas....

     

    Abs;

    quarta-feira, 11 de outubro de 2006 10:12

Todas as Respostas

  •  

     qual erro esta dando ? o sql nao retorna a mensagem de chave ducplicada ?

     

    Abs;

     

    segunda-feira, 9 de outubro de 2006 10:08
  • Bom dia Marcelo,

    A impressão que dá, é que ele não respeita o " if @@error <> 0 " pois ele não informa que commitou na base ,e se eu forçar um erro duplicando a chave ou passando como parâmetro uma chave que não existe ele também não me retorna nada. (quando falo que ele não me retorna nada é o print que faço dentro da estrutora de decisão if...else, como Gravou ou Falhou. Para que eu possa controlar a transação.)

     

    Ats.

    Wellington L. da Silva

    terça-feira, 10 de outubro de 2006 12:31
  • fiz o teste e rodou

     

    Create table TEste (cod_teste int, TTempoNJustif char(10), PendDados int)

    insert into TEste (cod_teste, TTempoNJustif, PendDados) Values (1,'TT',1)

    create procedure sp_update
       @tempo int, @nome char(10), @chave int
    as
       begin transaction
          update teste
             set PendDados=@tempo, TTempoNJustif=@nome
             where cod_teste =  @chave
    if @@error <>0
        begin
           rollback transaction
           print 'Falhou'
       end
    else
       begin
           commit transaction
           print 'Gravou'
       end

    sp_update 1,'teste',1

    (1 row(s) affected)

    Gravou

     

    onde vc. quer pegar esse erro ?, no query analiser ?

    terça-feira, 10 de outubro de 2006 16:34
  • Boa Noite Marcelo,

    isso estou tentando fazer no QA pois não será eu que programarei e sim uma outra pessoa só estou fazendo a modelagem de dados, as tabelas as sp's e triggers conforme eles vao me pedindo eu lhes envies o primeiro código e eles disseram que não retornava então teste no QA e realmente não voltava o print parecendo que ele iguinorava o if...else por exemplo quando vc cadastrou o 1, 'teste', 1 se eu tentar fazer um update que não funcionaria como sp_update 1, 'teste', 5 ele não me retorna o Falhou em vez disso ele me retorna o seguinte:

    (0 row(s) affected)

    Gravou

    Ele não deveria trazer o Falhou?  Pois não existe a chave  de valor 5 ou seja nenhuma alteração foi feita conseguentemente houve um rollback mais o print continua me informando que gravou!

     

     

    Vou tentar novamente. Se consegui eu dou um toque. rss rss

     

    Wellington L. da Silva

    minwellington@msn.com

     

    quarta-feira, 11 de outubro de 2006 03:48
  • e que na verdade nao falhou, apenas nao atualizou ou seja nao existe o erro, para tratar o erro se for atualizado use:

     

      Declare @LinhasAtt int

     

      depois do update

     

      Select @LinhasAtt = @@rowcount

     

      entao teste o valor de @LinhasAtt se ele for > 0 ele atualizou linhas....

     

    Abs;

    quarta-feira, 11 de outubro de 2006 10:12
  • Bom dia Marcelo,

     

    Valeu, muito obrigado. Este seu último script funcionaou belezinha.

     

     

    Wellington L. da Silva

    minwellington@msn.com

     

    quarta-feira, 11 de outubro de 2006 11:21