对于存储过程中调用其他存储过程时会使用很多事务,即每个存储过程中都存在事务!但是如果某一个存储过程出现回滚时,会报出“无法回滚Tran1,找不到该名称的事务或保存点。”解决此问题的方法是每个子存储过程中都创建一个变量来判断是否有活动的事务在运行。例子如下:
declare @trancounter int
set @trancounter=@@trancount
if(@trancounter>0)
begin
save tran Tran1
end
else
begin
begin transaction Tran1
end
if(@trancounter=0)
begin
commit transaction Tran1
end
if(@trancounter=0)
begin
rollback transaction Tran1
end
else
begin
if xact_state() <> -1
begin
rollback transaction Tran1
end
end
xact_state():此函数表示的意思是用于报告当前正在运行的请求的用户事务状态的标量函数。