6

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

谁能帮我解决这个问题。

编辑

对不起,我忘了提到,第二个插入语句中出现错误。

4

1 回答 1

8

您已经启动了一个隐式事务。要回滚,您需要启动显式事务(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
于 2012-07-17T08:24:31.797 回答