2012-07-17 135 views
5

我正在使用SQL Server 2012,并且使用回滚事务编写了一个小型存储过程。我的程序如下:如果@@ Trancount> 0不起作用

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 

正如你所看到的,在If条件,@@ TRANCOUNT> 0时,我试图回滚事务,但是当我执行的程序,回滚语句从未执行过,我已经调试过程并且@@ TRANCOUNT的值是1.但我仍然不明白为什么它不起作用。而且我知道我们不需要使用begin tran和end tran来回滚。

任何人都可以帮助我解决这个问题。

编辑

对不起,我忘了提及的是,在第二个INSERT语句中出现错误。

回答

5

您已开始隐式事务。 (BEGIN TRANSACTION)

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

您的意思是说,没有明确的交易,@@ trancount价值将永远是零礼仪?但我在调试时,我看到@@ trancount的值为1,但我没有使用任何开始tran和commit tran。 – Harsha 2012-07-17 08:57:57

+1

这是一个自动提交事务,不是隐式事务,除非SET IMPLICIT_TRANSACTION ON或SET ANSI DEFAULTS ON,尽管答案是正确的。 – 2014-07-08 10:36:40