Array
(
)

Problemas com Rollback

Robertolucio
   - 28 set 2004

Boa tarde a todos,

Novamente estou com problemas com o rollback e preciso de ajuda.

O meu scrpit é o seguinte:
CREATE PROCEDURE PNS_Acerta_Base @empresa smallint, @data_exclusao int, @usuario int OUTPUT AS

BEGIN TRANSACTION Acerta_Base
DECLARE @retorno smallint, @id int

segue o script.......

EXEC @retorno = PNS_Corrige_Contrato_Devolucao @empresa, @data_exclusao, @usuario, 0
IF @retorno0
BEGIN
ROLLBACK TRANSACTION Acerta_Base
DROP TABLE #Corrige_Contrato_Devolucao
GOTO FIM
END

SET @retorno = 0
COMMIT TRANSACTION Acerta_Base

FIM:
RETURN(@retorno)

---------------------------------------------------------------

CREATE PROCEDURE PNS_Corrige_Contrato_Devolucao @empresa smallint, @data_exclusao int, @usuario smallint, @controle smallint OUTPUT AS
BEGIN TRANSACTION Contrato_Devolucao

segue script.....

INSERT INTO Cores
SELECT CCD.Cod_Cor, ´SISGEM-Acerto Base´, @usuario
FROM #Corrige_Contrato_Devolucao CCD
WHERE NOT EXISTS (SELECT * FROM Cores WHERE Cores.Cod_Cor = CCD.Cod_Cor)
IF @@error0
BEGIN
ROLLBACK TRANSACTION Contrato_Devolucao
DROP TABLE Corrige_Contrato_Devolucao
IF @controle = 0 SET @retorno = 1
IF @controle = 1 SET @retorno = 7
GOTO FIM
END

DELETE FROM TabelaX
WHERE EXISTS (SELECT * FROM Exclui_Creditos A
WHEREA.Cod_Empresa = TabelaX.Cod_Empresa
ANDA.Num_Devolucao = TabelaX.Num_Devolucao )

IF @@error 0
BEGIN
SET @retorno = 2
ROLLBACK TRANSACTION Contrato_Devolucao
DROP TABLE Corrige_Contrato_Devolucao
GOTO FIM
END

SET @retorno = 0
COMMIT TRANSACTION Contrato_Devolucao

FIM:
RETURN(@retorno)

--------------------------------------------

Quando o erro acontece na PNS_Corrige_Contrato_Devolucao o rollback não acontece .

MENSAGEM DE ERRO DO SQLSERVER:
Server: Msg 6401, Level 16, State 1, Procedure PNS_Corrige_Contrato_Devolucao, Line 51
Cannot roll back Contrato_Devolucao. No transaction or savepoint of that name was found.
Server: Msg 266, Level 16, State 2, Procedure PNS_Corrige_Contrato_Devolucao, Line 235
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 2.

Já verifiquei as proc´s todo begin tran nometal tem o seu rollback tran nometal e/ou commit tran nometal.

Onde estou errando?

Sds,
Roberto

Robertolucio
   - 28 set 2004

Em tempo,

Na mesma situação se não ocorrer erro o COMMIT é executado, alterando assim a variável @@trancount, que é a que estou utilizando para verificar se o rollback funciona.

Att,
Roberto

Marcus.magalhaes
   - 28 set 2004

Boa tarde.

Vamos lá...qdo vc usa o Rollback, se vc não fez um save point, não adianta colocar o nome da transação...ele irá fazer rollback de td...Verifique a variávell @@trancount no 2 begin tran...vc verá q ela estará com valor 0.

Se vc quer voltar parcialmente use o save point, assim seu rollback nome_da_tran funcionará do jeito q vc quer.

Att,

Robertolucio
   - 28 set 2004

Marcos, boa noite.

Novamente obrigado pela solução!

Sds
Roberto