我正在使用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进行回滚。
任何人都可以帮我解决这个问题。
修改
抱歉,我忘了提到,第二个插入语句中出错。
答案 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