EXECUTE后的事务计数表示BEGIN和COMMIT语句的数量不匹配。上一次计数=1,当前计数=0

我有一个Insert存储过程,它将数据馈送到Table1,并从Table1获取Column1值,然后调用第二个存储过程,它将馈送到Table2

但当我将第二个存储过程调用为:

执行USPStoredProcName

我得到以下错误:

EXECUTE后的事务计数表示BEGIN和COMMIT语句的数量不匹配。上一次计数=1,当前计数=0

我已经阅读了其他类似问题的答案,但无法找到提交计数的确切位置

如果您有TRY/CATCH块,那么可能的原因是您正在捕获事务中止异常并继续。在CATCH块中,您必须始终检查XACT_STATE(),并处理相应的中止和不可模仿(注定)事务。如果您的调用者启动了一个事务,并且calee遇到了(比如)死锁(该死锁中止了事务),那么被调用者将如何与调用者沟通该事务已中止,并且不应继续“正常业务”?唯一可行的方法是重新引发异常,迫使调用方处理这种情况。如果您默默地吞下一个中止的事务,而调用方继续假设它仍然在原始事务中,那么只有混乱才能确保(而您得到的错误是引擎试图保护自己的方式)

我建议您浏览一下异常处理和嵌套事务,它显示了一种可用于嵌套事务和异常的模式:

创建过程[usp\u我的\u过程\u名称]
像
开始
不计数;
声明@trancount int;
设置@[email protected]@trancount;
开始尝试
如果@trancount=0
开始交易
其他的
保存事务usp\u我的\u程序\u名称;
--在这里做实际工作
lbexit:
如果@trancount=0
犯罪
结束尝试
开始捕捉
声明@error int、@message varchar(4000)、@xstate int;
选择@error=error\u NUMBER(),@message=error\u message(),@xstate=XACT\u STATE();
如果@xstate=-1
回降;
如果@xstate=1且@trancount=0
回降
如果@xstate=1且@trancount>0
回滚事务usp\u我的\u过程\u名称;
raiserror('usp_我的_程序名称:%d:%s',16,1,@error,@message);
端接
终止
去

发表评论