if @@ Trancount> 0不起作用

时间:2012-07-17 07:58:05

标签: transactions rollback sql-server-2012

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

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&gt; 0,我正在尝试回滚事务,但是当我执行该过程时,回滚语句永远不会被执行,我已经调试过程并且@@ TRANCOUNT的值是1.但是我仍然不明白为什么它不是工作。我知道我们不需要使用begin tran和end tran进行回滚。

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

修改

抱歉,我忘了提到,第二个插入语句中出错。

1 个答案:

答案 0 :(得分:7)

您已开始隐式交易。要回滚它,您需要启动显式事务(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