Problemas con Transactions, Try y Catch

05/06/2008 - 17:03 por Carlos Ruesta | Informe spam
Buenos dias,
Tengo un gran problema con el uso de transacciones controladas con try
y catch.
Aqui el código:

USE BD;
GO
CREATE PROCEDURE [dbo].[SP_TEMP]
AS
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION
Print 'Begin Transaction!!!'

INSERT INTO REGVENDA (ID_VENDA, VALOR) VALUES ('01010101',179.00)
INSERT INTO DOCVENDAXXXXXXX (ID_VENDA, COD_PROD, CANT) VALUES
('01010101','00023',1)
existe para probar el uso de tranascciones,
INSERT INTO REGVENDA (ID_VENDA, VALOR) VALUES ('01010102',119.00)
INSERT INTO DOCVENDA (ID_VENDA, COD_PROD, CANT) VALUES
('01010102','00051',1)
INSERT INTO DOCVENDA (ID_VENDA, COD_PROD, CANT) VALUES
('01010102','00079',2)

COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF (XACT_STATE()) = -1
BEGIN
ROLLBACK TRANSACTION;
PRINT 'Rollback Transaction';
RAISERROR ('ERROR, ', 16, 1);
END;
IF (XACT_STATE()) = 1
BEGIN
PRINT N'Transaccion es activa y valida, hago COMMIT... '
COMMIT TRANSACTION;
END;
END CATCH;

GO

EXECUTE [DBO].[SP_TEMP]


Al momento de ejecutar el store procedure aparece los siguientes erros
y obviamente no ejecuta el catch.

Begin Transaction!!!
Msg 208, Level 16, State 1, Procedure SP_TEMP, Line 9
Invalid object name 'DOCVENDAXXXXXXX'.
Msg 266, Level 16, State 2, Procedure SP_TEMP_VND6018420080604181352,
Line 10
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK
TRANSACTION statement is missing. Previous count = 0, current count 1.


ALGUIEN ME PUEDE AYUDAR CON ESTE PROBLEMA.

Muchas gracias.

Carlos Ruesta

Preguntas similare

Leer las respuestas

#1 Gux (MVP)
05/06/2008 - 18:54 | Informe spam
Agregue a su procedimiento una línea: SET XACT_ABORT ON;

justo después de la línea SET NOCOUNT ON.

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/p...o.larriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Carlos Ruesta" wrote:

Buenos dias,
Tengo un gran problema con el uso de transacciones controladas con try
y catch.
Aqui el código:

USE BD;
GO
CREATE PROCEDURE [dbo].[SP_TEMP]
AS
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION
Print 'Begin Transaction!!!'

INSERT INTO REGVENDA (ID_VENDA, VALOR) VALUES ('01010101',179.00)
INSERT INTO DOCVENDAXXXXXXX (ID_VENDA, COD_PROD, CANT) VALUES
('01010101','00023',1)
existe para probar el uso de tranascciones,
INSERT INTO REGVENDA (ID_VENDA, VALOR) VALUES ('01010102',119.00)
INSERT INTO DOCVENDA (ID_VENDA, COD_PROD, CANT) VALUES
('01010102','00051',1)
INSERT INTO DOCVENDA (ID_VENDA, COD_PROD, CANT) VALUES
('01010102','00079',2)

COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF (XACT_STATE()) = -1
BEGIN
ROLLBACK TRANSACTION;
PRINT 'Rollback Transaction';
RAISERROR ('ERROR, ', 16, 1);
END;
IF (XACT_STATE()) = 1
BEGIN
PRINT N'Transaccion es activa y valida, hago COMMIT... '
COMMIT TRANSACTION;
END;
END CATCH;

GO

EXECUTE [DBO].[SP_TEMP]


Al momento de ejecutar el store procedure aparece los siguientes erros
y obviamente no ejecuta el catch.

Begin Transaction!!!
Msg 208, Level 16, State 1, Procedure SP_TEMP, Line 9
Invalid object name 'DOCVENDAXXXXXXX'.
Msg 266, Level 16, State 2, Procedure SP_TEMP_VND6018420080604181352,
Line 10
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK
TRANSACTION statement is missing. Previous count = 0, current count > 1.


ALGUIEN ME PUEDE AYUDAR CON ESTE PROBLEMA.

Muchas gracias.

Carlos Ruesta

Respuesta Responder a este mensaje
#2 Carlos Ruesta
05/06/2008 - 19:47 | Informe spam
Gracias Gustavo!!

Bueno, controló el error del nombre de la tabla y revirtió la
transacción. Con la instruccion SET XACT_ABORT ON logré superar uno de
los objetivos: evitar continuar ejecutando las siguientes
instrucciones y revertir las instrucciones anteriores al error.

Pero además de eso queria que el error sea controlado por el CATCH lo
cual no sucede. Logrando eso el mensaje del error sería
personalizado.
No entanto, el programa para en la instrucción errada (CONTASXXXXXXX)
y aparece el siguiente error:

Msg 208, Level 16, State 1, Procedure SP_TEMP, Line 10
Invalid object name 'CONTASXXXXXXX'

Al parecer TRY - CATCH no controla ese tipo de error con nombres de
tabla inexistentes y también probé con un nombre de campo errado lo
cual tampoco controla.
Lo que si logré controlar con TRY - CATCH fueron los valores con tipos
de dados diferentes a los declarados en cada tabla.

Bueno, muchas gracias y si tienes alguna idea adicional, te agradezco
anticipadamente.

Abrazo.

Carlos Ruesta.
Respuesta Responder a este mensaje
#3 Gux (MVP)
05/06/2008 - 20:30 | Informe spam
Lamentablemente el tr-catch de SQL Server atrapa solamente algunas
excepciones, las de consistencia de datos en las transacciones. No sirve para
atrapar todo tipo de excepción, como por ejemplo una división entre 0.

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/p...o.larriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Carlos Ruesta" wrote:

Gracias Gustavo!!

Bueno, controló el error del nombre de la tabla y revirtió la
transacción. Con la instruccion SET XACT_ABORT ON logré superar uno de
los objetivos: evitar continuar ejecutando las siguientes
instrucciones y revertir las instrucciones anteriores al error.

Pero además de eso queria que el error sea controlado por el CATCH lo
cual no sucede. Logrando eso el mensaje del error sería
personalizado.
No entanto, el programa para en la instrucción errada (CONTASXXXXXXX)
y aparece el siguiente error:

Msg 208, Level 16, State 1, Procedure SP_TEMP, Line 10
Invalid object name 'CONTASXXXXXXX'

Al parecer TRY - CATCH no controla ese tipo de error con nombres de
tabla inexistentes y también probé con un nombre de campo errado lo
cual tampoco controla.
Lo que si logré controlar con TRY - CATCH fueron los valores con tipos
de dados diferentes a los declarados en cada tabla.

Bueno, muchas gracias y si tienes alguna idea adicional, te agradezco
anticipadamente.

Abrazo.

Carlos Ruesta.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida