存储过程中的SQL Server嵌套事务管理

时间:2018-10-02 16:30:41

标签: sql sql-server transactions

我已经在存储过程中实现了事务管理,但是仍然出现错误

  

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

如果您还有其他需要,请告诉我。

谢谢。

0 个答案:

没有答案