我已经在存储过程中实现了事务管理,但是仍然出现错误
EXECUTE之后的事务计数表明BEGIN和COMMIT语句的数量不匹配。上一个计数= 1,当前计数= 0。
当内部程序中发生错误时,它会自动回滚所有预期的外部过程(回滚后事务计数变为零),然后SQL Server执行外部程序的catch块,并期望为我在外部程序中打开的交易对我来说很奇怪。我的假设是当SQL Server回滚事务时,它回滚所有以前的txns,但我不确定为什么要期待再次回滚外部事务(它在内部txn回滚期间已经完成了此步骤)。
下面是示例代码
create table A (ID int)
alter procedure p1 AS
begin try
begin transaction
insert into A values (1)
commit;
end try
begin catch
rollback transaction
end catch
alter procedure p2 AS
begin try
begin transaction
insert into A values ('A')
commit;
end try
begin catch
rollback transaction
end catch
alter procedure p3 AS
begin try
begin transaction
EXEC p1
EXEC p2
if @@TRANCOUNT > 0
commit;
end try
begin catch
if @@TRANCOUNT > 0
rollback transaction
PRINT ERROR_MESSAGE();
end catch
EXEC p3
如果您还有其他需要,请告诉我。
谢谢。