Transactions 如果@@Trancount>;0不工作
我正在使用SQL Server 2012,我编写了一个带有回滚事务的小存储过程。我的程序如下: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
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