Transactions 如果@@Trancount>;0不工作

Transactions 如果@@Trancount>;0不工作,transactions,rollback,sql-server-2012,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 (@Em

我正在使用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
ALTER-PROCEDURE[dbo].[uspinertemployee]
@EmpId int,
@员工姓名varchar(50岁),
@DeptId int
作为
开始
开始尝试
插入部门值(@DeptId,'Testing 1');
在员工值中插入(@EmpId、@EmployeeName、@DeptId);
结束尝试
开始捕捉
--此处记录错误
转到错误\u回滚
端接
错误\u回滚:
如果@TRANCOUNT>0
开始
打印“回滚事务”/*0,我正在尝试回滚事务,但当我执行该过程时,rollback语句从未执行,我已调试该过程,并且@TRANCOUNT的值为1。但我仍然不明白为什么它不起作用。我知道我们不需要使用begin-tran和end-tran进行回滚

有人能帮我解决这个问题吗

编辑


抱歉,我忘了提及,第二条insert语句中出现错误。

您已启动隐式事务。要回滚,您需要启动一个显式事务(BeginTransaction)

ALTER-PROCEDURE[dbo].[uspinertemployee]
@EmpId int,
@员工姓名varchar(50岁),
@DeptId int
作为
开始
开始尝试
开始训练
插入部门值(@DeptId,'Testing 1');
在员工值中插入(@EmpId、@EmployeeName、@DeptId);
提交传输
结束尝试
开始捕捉
--此处记录错误
转到错误\u回滚
端接
错误\u回滚:
如果@TRANCOUNT>0
开始

打印“回滚事务”/*您的意思是说,如果没有显式事务,@@trancount值将始终为零?但在调试时,我看到@trancount值为1。但我没有使用任何begin tran和commit tran。这是一个自动提交事务,不是隐式事务,除非将implicit_事务设置为ON,或将ANSI默认值设置为ON,尽管答案是正确的。
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