2012-07-17 19 views
5

Estoy usando SQL Server 2012 y escribí un pequeño procedimiento almacenado con la transacción de retrotracción. Mi procedimiento es el siguiente:si @@ Trancount> 0 no funciona

ALTER PROCEDURE [dbo].[uspInsertEmployee] 
@EmpId int, 
@EmployeeName varchar(50), 
@DeptId int 
AS 
BEGIN 
BEGIN TRY 

insert into Departments values (@DeptId, 'Testing 1'); 
insert into Employees values (@EmpId, @EmployeeName, @DeptId); 

END TRY 
BEGIN CATCH 

--log error here 
Goto Error_Rollback 
END CATCH 

Error_Rollback: 

IF @@TRANCOUNT > 0 
BEGIN 
    print 'rolling back transaction' /* <- this is never printed */ 
    ROLLBACK TRAN 
END 
END 

Como se puede ver, en la condición Si, cuando @@ TRANCOUNT> 0, estoy tratando de deshacer la transacción, pero cuando ejecuto el procedimiento, la declaración de recuperación sea de nunca ejecutado, he depurado el procedimiento y el valor de @@ TRANCOUNT es 1. Pero aún no entiendo por qué no está funcionando. Y llegué a saber que no necesitamos usar comenzar tran y finalizar tran para revertir.

¿Alguien me puede ayudar a resolver este problema.

EDITAR

En este momento se me olvidó mencionar que, se produce un error en la segunda instrucción de inserción.

Respuesta

5

Has comenzado una transacción implícita. para rodar de nuevo, lo que necesita para iniciar una transacción explícita (iniciar la transacción)

ALTER PROCEDURE [dbo].[uspInsertEmployee] 
    @EmpId int, 
    @EmployeeName varchar(50), 
    @DeptId int 
AS 

BEGIN 

BEGIN TRY 
    BEGIN TRAN 
    insert into Departments values (@DeptId, 'Testing 1'); 
    insert into Employees values (@EmpId, @EmployeeName, @DeptId); 
    COMMIT TRAN 
END TRY 

BEGIN CATCH 
    --log error here 
Goto Error_Rollback 
END CATCH 

Error_Rollback: 

    IF @@TRANCOUNT > 0 
    BEGIN 
    print 'rolling back transaction' /* <- this is never printed */ 
    ROLLBACK TRAN 
    END 

END 
+0

Quiere decir que sin transacción explícita, el valor trancount @@ siempre será cero rito? pero mientras estaba depurando, vi @@ valor de trancount como 1. pero no uso ningún inicio y compromiso. – Harsha

+1

Esta es una transacción de confirmación automática y no implícita, a menos que SET IMPLICIT_TRANSACTION ON, o SET ANSI DEFAULTS ON, aunque la respuesta sea correcta. –

Cuestiones relacionadas